Tag: garbage collection

eclipse内存分析器看到整个堆转储的小部分(363,2MB)(8GB)

我试图调查java.lang.OutOfMemoryError: GC limit exceeded ,这是在我们在tomcat中部署的Web应用程序的高负载时发生的。 堆大小设置为8GB( -Xms2048m -Xmx8192m ) 在某些时候,由于GC活动开销,我们的应用程序变得无法响应。 我可以在日志中看到Full GC连续多次出现。 所以我用以下命令进行了堆转储( jmap -F -dump:format=b,file=/root/dump2.hprof 4963 )。 包含dump的文件大小为9GB。 在转储(app被冻结约45分钟)后,发生了多个完整的GC,直到OutOfMemoryError 。 这是GC活动的对数样本 [Full GC [PSYoungGen: 932096K->875513K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6467961K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.3954040 secs] [Times: user=47.60 sys=0.43, real=12.39 secs] [Full GC [PSYoungGen: 932096K->890562K(1864128K)] [ParOldGen: 5592447K->5592447K(5592448K)] 6524543K->6483009K(7456576K) [PSPermGen: 112285K->112285K(262144K)], 12.6131900 secs] [Times: user=48.45 sys=0.49, real=12.61 secs] [Full […]

Concurrent Mark Sweep(CMS)是否能阻止世界事件?

我看到许多类的卸载,我的整个系统将在这段时间内挂起.. [Unloading class sun.reflect.GeneratedMethodAccessor117] [Unloading class sun.reflect.GeneratedConstructorAccessor1896] [Unloading class sun.reflect.GeneratedSerializationConstructorAccessor485] [Unloading class sun.reflect.GeneratedSerializationConstructorAccessor579] …. // about 1700 of them 同时我没有看到烫发空间的峰值,所以它似乎不是GC事件。 我想知道以下内容 IS Concurrent Mark Sweep收集了一个停止世界事件? 即使烫发空间不满也会发生吗?

如何在Java中标记为最终化的对象(以便第二次不调用finalize方法)?

主要问题是在主题中,但让我展示我对Java中的最终化过程的看法,以便我可以再问你一点。 那么gc通过标记所有活动对象来启动垃圾收集。 当所有可到达的对象都标记为“活动”时。 所有其他对象都无法访问。 下一步是检查每个无法到达的对象,并确定它是否可以立即进行清理,或者应该首先完成。 如果对象的finalize方法有一个主体,那么gc会想到下一个方法,那么这个对象是可以最终确定的,应该最终确定; 如果对象的finalize方法有一个空体(protected void finalize(){})那么它不能最终化并且现在可以被gc清理。 (我是对的吗?) 所有可终结的对象将被放入同一队列中,以便稍后逐一完成。 据我所知,可终结的对象可以花费大量时间放在队列中,同时等待轮到它完成。 这可能发生,因为通常只有一个名为Finalizer的线程从队列中获取对象并调用它们的finalize方法,当我们在某个对象的finalize方法中有一些耗时的操作时,队列中的其他对象将等待很长时间才能完成。 好的,当一个对象完成后,它被标记为FINALIZED并从队列中删除。 在下一个垃圾收集过程中,收集器将看到此对象无法访问(再次)并且具有非空的finalize方法(再次),因此该对象应该被放入队列中(再次) – 但它不会因为收集器以某种方式看到这个对象被标记为FINALIZED。 (这是我的主要问题:这个对象被标记为FINALIZED的方式,收集器如何知道该对象不应该再次定型?)

如何在Java中清除软引用?

我有一个缓存,它具有对缓存对象的软引用。 我正在尝试为类的行为编写function测试,这些类使用缓存专门用于清除缓存对象时发生的情况。 问题是:我似乎无法可靠地获得要清除的软引用。 简单地使用一堆内存不起作用:在清除任何软引用之前,我得到一个OutOfMemory。 有没有办法让Java更加热切地清理软引用? 在这里找到 : “虽然在抛出OutOfMemoryError之前所有SoftReferences都会被清除,但是理论上它们不会导致OOME。” 那么这是否意味着上面的场景必须意味着我的内存泄漏,某些类在我的缓存对象上持有一个硬引用?

Java在序列化期间没有堆空间

以下代码导致OutOfMemmoryError:大约300万行的堆空间。 分配给JVM的内存为4 GB,使用64位安装。 while (rs.next()) { ArrayList arrayList = new ArrayList(); for (int i = 1; i <= columnCount; i++) { arrayList.add(rs.getString(i)); } objOS.writeObject(arrayList); } ArrayList引用的内存在while循环的每次迭代中都有资格进行垃圾收集,而内部JVM在抛出OutOfMemory错误之前会调用垃圾收集( System.gc() ),因为堆空间。 那么为什么会发生exception呢?

有人能理解G1垃圾收集器输出吗?

我使用以下选项运行G1垃圾收集器的Java程序: -XX:-UseBiasedLocking -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/var/tmp/gclog.out 输出看起来像这样…… 44900.297: [GC pause (young)44900.386 (initial-mark), 0.08894851 secs] : [GC concurrent-mark-start] [Parallel Time: 83.7 ms] [GC Worker Start Time (ms): 44900297.6 44900297.6 44900297.6 44900297.6 44900297.6 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 44900297.7 Avg: 44900297.7, Min: 44900297.6, Max: 44900297.7, Diff: 0.1] [Update RS (ms): 23.5 24.3 25.0 […]

Java DirectByteBuffer包装器是垃圾收集的吗?

我明白当分配一个directbytebuffer时,它不受垃圾收集的影响,但我想知道的是包装对象是否被垃圾收集。 例如,如果我分配了一个新的DirectByteBuffer dbb,然后使用dbb.duplicate()复制(浅层复制)它,我会在同一块内存周围有两个包装器。 那些包装纸是否需要进行垃圾收集? 如果我做了 while(true){ DirectByteBuffer dbb2 = dbb.duplicate(); } 我最终会自己OOM吗?

我怎样才能弄清楚什么是不确定的物体?

我们的一个程序有时会在一个用户的计算机上出现OutOfMemory错误,但当然不是在我测试它时。 我只是用JProfiler运行它(在10天的评估许可证上,因为我之前从未使用它),并且对我们的代码前缀进行过滤,总大小和实例数量中最大的块是特定简单类的8000多个实例。 我点击了JProfiler上的“Garbage Collect”按钮,我们其他类的大部分实例都消失了,但不是这些特殊的。 我再次运行测试,仍然在同一个实例中,它创建了4000多个类的实例,但当我点击“垃圾收集”时,那些离开了8000多个原始实例。 这些实例会在各个阶段陷入各种集合中。 我认为它们不是垃圾收集的事实必然意味着某些东西持有对其中一个集合的引用,以便保持对对象的引用。 有什么建议我如何弄清楚什么是持有参考? 我正在寻找在代码中寻找什么的建议,以及如果有的话在JProfiler中找到它的方法。

Java阻塞问题:为什么JVM会在许多不同的类/方法中阻塞线程?

更新:这看起来像一个内存问题。 一个3.8 Gb的Hprof文件表明当发生“阻塞”时,JVM正在转储它的堆。 我们的运营团队发现该站点没有响应,进行了堆栈跟踪,然后关闭了该实例。 我相信他们在堆转储完成之前关闭了网站。 日志没有错误/exception/问题证据 – 可能是因为JVM在生成错误消息之前被杀死了。 原始问题我们有一个最近的情况,应用程序出现 – 最终用户 – 挂起。 我们在应用程序重启之前得到了一个堆栈跟踪,我发现了一些令人惊讶的结果:527个线程,463个线程状态为BLOCKED。 在过去过去被阻塞的线程通常有这个问题:1)一些明显的瓶颈:例如一些数据库记录锁定或文件系统锁定问题导致其他线程等待。 2)所有被阻塞的线程将阻塞相同的类/方法(例如jdbc或文件系统clases) 不寻常的数据在这种情况下,除了应用程序类(包括jdbc和lucene调用)之外,我还看到了各种类/方法被阻止,包括jvm内部类,jboss类,log4j等 问题是什么会导致JVM阻止log4j.Hierarchy.getLogger,java.lang.reflect.Constructor.newInstance? 显然有些资源“稀缺”,但哪些资源? 谢谢 将 堆栈跟踪摘录 http-0.0.0.0-80-417″ daemon prio=6 tid=0x000000000f6f1800 nid=0x1a00 waiting for monitor entry [0x000000002dd5d000] java.lang.Thread.State: BLOCKED (on object monitor) at sun.reflect.GeneratedConstructorAccessor68.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at java.lang.Class.newInstance0(Class.java:355) at java.lang.Class.newInstance(Class.java:308) at org.jboss.ejb.Container.createBeanClassInstance(Container.java:630) http-0.0.0.0-80-451″ daemon prio=6 tid=0x000000000f184800 nid=0x14d4 […]

使用NIO直接缓冲区时设置-XX:+ DisableExplicitGC的影响

我们正在构建一个具有积极性能SLA的Web应用程序,由于JVM因System.gc()调用而外出午餐,因此会定期违反这些SLA。 我们已经做了一些调试,并确定在所有情况下它都是调用System.gc()的内部应用服务器代码。 在app服务器启动或部署应用程序时会发生这种情况,我们并不关心。 但是,当应用程序启动并通过内部应用程序服务器调用NIO类时,也会定期触发System.gc()。 这是我们能够捕获此事件的堆栈跟踪: 3XMTHREADINFO “WebContainer : 25” J9VMThread:0x0000000006FC5D00, j9thread_t:0x00007F60E41753E0, java/lang/Thread:0x000000060B735590, state:R, prio=5 3XMJAVALTHREAD (java/lang/Thread getId:0xFE, isDaemon:true) 3XMTHREADINFO1 (native thread ID:0x1039, native priority:0x5, native policy:UNKNOWN) 3XMTHREADINFO2 (native stack address range from:0x00007F6067621000, to:0x00007F6067662000, size:0x41000) 3XMCPUTIME CPU usage total: 80.222215853 secs 3XMHEAPALLOC Heap bytes allocated since last GC cycle=1594568 (0x1854C8) 3XMTHREADINFO3 Java callstack: 4XESTACKTRACE at java/lang/System.gc(System.java:329) […]