Tag: garbage collection

java GC发生了什么? PermGen空间正在填补?

我不知道我的java进程发生了什么。 此过程是索引过程。 它从一组zip文件中读取文档,并将它们添加到lucene索引中。 GC日志显示它正在连续运行Full GC。 4959.569: [Full GC 19960K->19960K(10617856K), 0.1648590 secs] 4959.764: [Full GC 19960K->19960K(10617856K), 0.1650240 secs] 4959.959: [Full GC 19960K->19960K(10617856K), 0.1649380 secs] 4960.154: [Full GC 19960K->19960K(10617856K), 0.1650000 secs] 4960.350: [Full GC 19960K->19960K(10617856K), 0.1648900 secs] 至于我可以解释这些线,前后对象的大小约为19M,但为什么它一直在运行呢? 线程转储如下所示: ……..[Unloading class sun.reflect.GeneratedConstructorAccessor1] [Unloading class sun.reflect.GeneratedConstructorAccessor2] [Unloading class sun.reflect.GeneratedConstructorAccessor3] 2012-01-13 12:55:24 Full thread dump Java HotSpot(TM) 64-Bit Server […]

是-XX:+ UseG1GC正确替换-Xincgc?

目前,我们通过在java命令中添加-Xincgc来使用增量垃圾收集器。 在JDK 8中,不推荐使用此开关。 那么什么是它的等效替代品呢? -XX:+UseG1GC ? 背景:应用程序有一个8GB的堆,并创建了许多短生命对象。 我注意到它经常暂停几秒钟来进行垃圾收集。 出于好奇,我添加了-Xincgc并发现停顿消失了,整体性能提高了~4倍。 不幸的是,我没有找到任何关于-Xincgc触发什么类型的垃圾收集器的-Xincgc 。 有CMS(并发标记和扫描)和新G1(垃圾优先)。 但是我用-Xincgc得到了-Xincgc ?

为什么大多数JVM gcs都不使用refcounts?

为什么他们不需要它们,如果有人决定实施使用它们的VM,他们可能遇到什么问题?

当我们将Xmx和Xms设置为相同大小时会发生什么

当我们将Xms和Xmx的值设置为相等时,对HotGot中的FullGC或年轻/终身gen的分配有什么影响。 它在JRockit中有什么不同吗?

有谁知道在Java中配置GC的好指南?

我在运行应用程序的JVM上遇到了麻烦,它的堆内存看起来像梳子。 它不断从1.5 GB跳到3 GB,并逐渐恶化到更高的值。 我正在使用G1 GC算法,但不知道如何配置它。 我无法访问我正在运行的应用程序的代码,不用说,它是一个相当大的应用程序。 那么,最重要的是,有没有人知道在Java中配置GC的好指南?

超出范围时,ExecutorService是否会收集垃圾?

我问这个问题是因为我正在创建大量的执行程序服务,虽然我可能已经在需要调查的地方发生内存泄漏,但我认为最近对以下代码的更改实际上使其恶化,因此我试图确认到底是怎么回事: @FunctionalInterface public interface BaseConsumer extends Consumer { @Override default void accept(final Path path) { String name = path.getFileName().toString(); ExecutorService service = Executors.newSingleThreadExecutor(runnable -> { Thread thread = new Thread(runnable, “documentId=” + name); thread.setDaemon(true); return thread; }); Future future = service.submit(() -> { baseAccept(path); return null; }); try { future.get(); } catch (InterruptedException ex) { […]

Java ConcurrentMarkSweep垃圾收集器不会删除所有垃圾

简短forms:CMS垃圾收集器似乎未能收集到越来越多的垃圾; 最终,我们的JVM填满了,应用程序变得没有响应。 通过外部工具(JConsole或jmap -histo:live )强制GC清理一次。 更新:问题似乎与JConsole的JTop插件有关; 如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,行为就会消失。 (技术说明:我们在Linux 2.6.9盒子上运行Sun JDK 1.6.0_07,32位。升级JDK版本并不是一个选择,除非有一个不可避免的主要原因。另外,我们的系统不是连接到可访问Internet的计算机,因此JConsole等的屏幕截图不是一个选项。) 我们当前正在运行带有以下标志的JVM: -server -Xms3072m -Xmx3072m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+DisableExplicitGC 在JConsole中观察内存图,有一个完整的GC,在我们的应用程序生命周期的前几个小时内每隔约15分钟运行一次; 在每个完整的GC之后,仍然有越来越多的内存在使用中。 几个小时后,系统达到稳定状态,CMS旧版中大约有2GB的已用内存。 这听起来像是经典的内存泄漏,除非我们使用任何强制完整GC的工具(点击JConsole中的“收集垃圾”按钮,或运行jmap -histo:live等),旧版本突然降至~500MB使用,我们的应用程序在接下来的几个小时内再次响应(在此期间相同的模式继续 – 在每个完整的GC之后,越来越多的旧版本已经满了。) 需要注意的一点是:在JConsole中,报告的ConcurrentMarkSweep GC计数将保持为0,直到我们使用jconsole / jmap / etc强制GC。 使用jmap -histo和jmap -histo:live按顺序生成,我能够确定明显未收集的对象包括: 几百万个HashMap和HashMap$Entry数组(比例为1:1) 数百万个Vector和对象数组(1:1的比例,与HashMaps的数量大致相同) 几百万个HashSet , Hashtable和com.sun.jmx.remote.util.OrderClassLoader ,以及Hashtable$Entry数组(大约相同数量的每个;大约是HashMaps和Vectors的一半) 下面的GC输出有一些摘录; 我对它们的解释似乎是CMS GC在没有故障转移到世界末日GC的情况下中止。 我是否以某种方式误解了这个输出? 有什么东西会导致这种情况吗? 在正常运行时期间,CMS GC输出块看起来像这样: 36301.827: […]

当堆栈中仍然可见时,未使用的对象是否可用于垃圾收集?

在以下示例中,有两个function相同的方法: public class Question { public static String method1() { String s = new String(“s1”); // some operations on s1 s = new String(“s2”); return s; } public static String method2() { final String s1 = new String(“s1”); // some operations on s1 final String s2 = new String(“s2”); return s2; } } 但是在它们的第一个(方法1)中,字符串“s1”在return语句之前显然可用于垃圾收集。 在第二个( […]

java.lang.OutOfMemoryError:压缩类空间

我们正在运行java-8-oracle。 我们六个月前搬到了java8。 在过去的几天里,我们不时收到OOME,但我们无法识别或重现问题。 当我们执行对服务器(tomcat)的调用时,我们在stacktrace上得到这个错误: java.lang.OutOfMemoryError: Compressed class space 重新启动服务器可以解决问题。 对其他服务器的相同调用也起作用,对另一个类型的另一个调用也是如此。 在gc.log上查看时,我们看到: 2015-05-27T16:05:42.991+0000: 98774.440: [Full GC (Last ditch collection) 98774.440: [CMS: 575745K->575330K(3495936K), 0.8687777 secs] 575745K->575330K(4107008K), [Metaspace: 97940K->97940K(1396736K)], 0.8696093 secs] [Times: user=0.95 sys=0.00, real=0.88 secs] 2015-05-27T16:05:55.486+0000: 98786.935: [Full GC (Metadata GC Threshold) 98786.935: [CMS: 573414K->578735K(3495936K), 0.9372859 secs] 925046K->578735K(4107008K), [Metaspace: 99428K->99428K(1396736K)], 0.9386626 secs] [Times: user=1.01 sys=0.00, real=0.94 secs] […]

java.util.concurrent.LinkedBlockingQueue中的奇怪代码

所有! 我在LinkedBlockingQueue中发现了奇怪的代码: private E dequeue() { // assert takeLock.isHeldByCurrentThread(); Node h = head; Node first = h.next; h.next = h; // help GC head = first; E x = first.item; first.item = null; return x; } 谁能解释为什么我们需要局部变量h? 它对GC有什么帮助?