Tag: garbage collection

Java:将引用设置为null不会影响对象

我有一个简单的问题。 在下面的代码中,为什么s3的值仍然打印,尽管之前我将它设置为null。 似乎gargbage收集器不会被调用。 public class Test { public static void main(String[] args) { String s1 = “abc”, s2 = “def”, s3 = “ghj”; String sarr[] = {s1, s2, s3}; s3 = null; System.gc(); for(int i = 0; i < sarr.length; i++) { System.out.print(sarr[i] + " "); //prints abc def ghj } } } 任何想法将不胜感激。

Java中垃圾收集的合格变量

我正在为OCPJP做准备,我被困在以下模拟考试题目中: 鉴于: 3. interface Animal { void makeNoise(); } 4. class Horse implements Animal { 5. Long weight = 1200L; 6. public void makeNoise() { System.out.println(“whinny”); } 7. } 8. public class Icelandic extends Horse { 9. public void makeNoise() { System.out.println(“vinny”); } 10. public static void main(String[] args) { 11. Icelandic i1 = new […]

Java – Full GC(垃圾收集器)在短时间间隔内发生很多事情,导致性能下降

我在prod环境中看到一些exception行为导致我们在运行Tomcat的服务器上出现高线程数。 堆大小10,092,544K在新一代和产权生成之间分配为2,752,512K + 7,340,032K = 10,092,544K。 我很困惑为什么GC在堆上有足够的内存可用时多次运行(新旧两种)(Full GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen:2748534K-> 2748529K(7340032K) )]) 你可以看到0K-> 0K的年轻人和.27G – > .27G的老一代意味着几乎没有任何对象得到gc’d并且有很多可用的内存。 (堆大小为10G)。 由于Full GC在短时间间隔内运行多次,因此导致性能降低,因此应用程序无法处理传入的用户请求,因此无法处理服务器上的高线程,最终我们必须重新启动服务器以摆脱这种情况。 你能解释一下这里发生了什么。 这是gc.log上的输出。 。 。 更多…… 。 。 7月18日14:52:38 fwprodcontent03 gc.log:3172.122:[GC [PSYoungGen:0K-> 0K(2752512K)] 2750855K-> 2750855K(10092544K),0.0515920 secs] [次:用户= 0.32 sys = 0.01,real = 0.06秒] 7月18日14:52:42 fwprodcontent03 gc.log:3172.174:[Full GC [PSYoungGen:0K-> 0K(2752512K)] [ParOldGen:2750855K-> 2749937K(7340032K)] 2750855K-> 2749937K(10092544K)[PSPermGen:262143K – > […]

诊断Java内存问题的策略

我的任务是调试Java(J2SE)应用程序,在一段时间的活动开始后抛出OutOfMemoryexception。 我是Java新手,但有编程经验。 我有兴趣就诊断这样的问题的好方法得到你的意见吗? 到目前为止,我已经使用JConsole来了解正在发生的事情。 我有预感,有些物品没有被正确释放,因此在垃圾收集过程中没有被清理干净。 我是否可以使用任何工具来获取对象生态系统的图片? 你会从哪里开始的?

Java的G1垃圾收集器(G1GC)中的类卸载

在Java 6中,我们过去使用以下GC配置来防止在我们的应用程序的多次重新部署后出现Perm Gen OutOfMemoryException : -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled 我们正在转向Java 7,并希望使用新的G1 GC,从我所读过的内容中,将类从Java内存中的PermGen移动到本机内存。 是否有一些标志可以卸载未使用的类?

在java CMS gc日志中,’real’,’user’和’sys’是什么意思?

对于以下Java版本: OpenJDK版“1.6.0” OpenJDK运行时环境(版本1.6.0-b23) OpenJDK 64位服务器VM(内置20.0-b11,混合模式) 使用以下GC标记: -verbose:GC -XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps 我们得到的日志行如下: 2012-11-09T16:46:53.438-0100:[CMS-concurrent-mark:4.039 / 4.060 secs] [次:用户= 4.09 sys = 35.05,real = 4.06 secs] 最初的“4.039 / 4.060秒”应根据https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs表示并发标记总共需要4.039秒的cpu时间和4.060秒的挂起时间(包括其他线程的收益率) )。 但是用户,系统和实际值在这里意味着什么?

什么原因导致Java中的长旋转和同步时间?

在Java 8 Update 45中,将这些选项添加到java调用中: -XX:+PrintGCApplicationStoppedTime -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 向我显示这些统计数据: vmop [threads: total initially_running wait_to_block] [time: spin block sync cleanup vmop] page_trap_count 3679.229: no vm operation [ 72 1 2 ] [ 6016 0 6016 0 0 ] 1 2015-05-22T11:25:27.519+0200: Total time for which application threads were stopped: 6.0168551 seconds, Stopping threads took: 6.0164099 seconds 这里的问题是Stopping threads时间很长。 […]

什么时候JVM抛出OutOfMemoryError

我们正在运行一个有时“冻结”的Java应用程序,因为某些线程几乎使用了所有堆。 尽管JVM执行Full GC持续时间超过60秒,但应用程序永远不会因OutOfMemoryError而死亡。 我从Java文档中读到: 如果花费太多时间进行垃圾收集,吞吐量收集器将抛出内存不足的exception。 例如,如果JVM花费超过总时间的98%进行垃圾收集并且正在恢复少于2%的堆,那么它将导致内存不足。 我想了解更多关于这98%的时间意味着什么(时间框架是什么?)的信息,以及是否可以降低此值,即如果应用程序在GC中花费90%的时间并且无法释放,则抛出OOME超过10%的堆。 目标是确保应用程序将在OOME中死亡(而不是仅运行GC),因此我们可以在OOME上生成转储。 以下是我们使用的内存和GC设置(操作系统是Solaris): -Xms2048m -Xmx2048m \ -Xmn512m \ -XX:PermSize=256m -XX:MaxPermSize=256m \ -XX:+UseParNewGC -XX:ParallelGCThreads=16 \ -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled \ -XX:+DisableExplicitGC \ -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps \ -XX:+PrintClassHistogram \ -Xloggc:/gcmonitor.log \ -XX:+HandlePromotionFailure \ -XX:SurvivorRatio=4 -XX:TargetSurvivorRatio=90 -XX:MaxTenuringThreshold=10 \ -XX:+UseTLAB -XX:TLABSize=32k -XX:+ResizeTLAB \ -XX:+UseMPSS \

java垃圾收集在对话框中

*当我尝试在JFrame中创建一个按钮时,我现在遇到一个非常奇怪的java GC问题,当我单击该按钮时,它会显示需要处理并显示一些图像并需要近200M内存的JDialog。 但问题是当我关闭对话框并重新打开它时,有时它会导致java.lang.OutOfMemoryError。 (不是每次都) 试图解决这个问题,我简化了这个问题并做了一些实验, 这让我更加困惑。 我在“实验”中使用的代码如下所示。 当我单击一个框架中的一个按钮时,我为一个整数数组分配160M内存,并显示一个对话框, 但如果我关闭该对话框并重新打开它,则会出现OutOfMemoryError。 我调整代码,结果是: 如果我不创建对话框并显示它,没有内存问题。 如果我添加一个调用System.gc()的windowsCloseListener到对话框,没有内存问题。 如果我在run()方法中调用System.gc(),则会显示内存问题。 public class TestController { int[] tmp; class TDialog extends JDialog { public TDialog() { super(); this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); // If I uncommment this code, OutOfMemoryError seems to dispear in this situation // But I’m sure it not a acceptable solution /* this.addWindowListener(new WindowAdapter() { […]

什么可以解释写入堆位置引用的巨大性能损失?

在研究分代垃圾收集器对应用程序性能的微妙后果时,我已经在一个非常基本的操作 – 一个简单的写入堆位置 – 的性能方面遇到了相当惊人的差异,关于所写的值是原始值还是引用。 微基准 @OutputTimeUnit(TimeUnit.NANOSECONDS) @BenchmarkMode(Mode.AverageTime) @Warmup(iterations = 1, time = 1) @Measurement(iterations = 3, time = 1) @State(Scope.Thread) @Threads(1) @Fork(2) public class Writing { static final int TARGET_SIZE = 1024; static final int[] primitiveArray = new int[TARGET_SIZE]; static final Object[] referenceArray = new Object[TARGET_SIZE]; int val = 1; @GenerateMicroBenchmark public void fillPrimitiveArray() […]