46得票1回答
为什么在 Java 9 G1 工作约 6 小时后,即使实际负载没有增加,性能也会下降?

我将一个实例(2 vCPU、2GB RAM,负载约为4k req/sec)从最新的Java 8切换到Java 9。一开始一切都很好,CPU使用率与之前相同。然而,大约6小时后,CPU消耗增加了4%(从21%增加到25%),原因不明。我没有流量激增,没有增加内存消耗,没有度量变化(我对代码中的每...

16得票1回答
Java G1: 生产环境下内存泄漏的监控

多年来,我们一直使用+UseParallelOldGC运行具有适度堆大小的Java服务。现在,我们开始推出一个使用更大堆和G1收集器的新服务。这个进展顺利。 对于使用+UseParallelOldGC的服务,我们通过查看老一代集合后的大小并在阈值上发出警报来监视内存泄漏。这非常有效,事实上,...

9得票6回答
为什么要进行字符串去重,当我们已经有了字符串池?

字符串去重: 在任何应用程序中,字符串消耗了很多内存。每当垃圾收集器访问字符串对象时,会注意到字符数组。它获取它们的哈希值并将其存储在一个弱引用到数组的旁边。一旦它找到另一个具有相同哈希代码的字符串,它将逐个比较它们的字符。如果它们也匹配,则一个字符串将被修改并指向第二个字符串的字符数组。...

7得票1回答
如何解释 G1 GC 日志以及在 OutOfMemoryError 之前的相关内容?

我想知道有没有人能够解释一下G1 GC日志如何导致OutOfMemoryError? 我知道堆转储是找出实际使用堆的最佳方法,但是由于其中包含不能离开客户端站点的受保护信息,因此我无法获得它。我所拥有的只有应用程序日志(其中包括OOME的堆栈)和G1 GC日志。 完整的G1 GC日志包含很...

92得票16回答
Java G1垃圾回收在生产中的应用

由于Java 7默认使用新的G1垃圾回收器,Java是否能够处理比以前更大的堆内存而不会出现“灾难性”的GC暂停时间?是否有人在生产环境中实际实施了G1,那么你的经验如何? 公平地说,我只在非常大的堆上看到过真正长的GC暂停时间,比工作站多得多。为了澄清我的问题:G1是否会打开通向数百GB或...

9得票1回答
G1GC是否会在Xms=Xmx的情况下将内存释放回操作系统?

阅读了像这篇回答和JEP-346这样的内容后,我意识到G1确实会将内存释放回操作系统。 然而,它是否会将内存释放回操作系统,甚至降低当前内存使用量到初始堆内存以下(即在此JEP之前,在我的情况下是JDK11)? 假设我有一个Java 11 VM运行,其中Xms和Xmx设置为5GB,在8GB...

29得票6回答
G1GC仍然没有正式的生产就绪吗?

我想知道JDK 7版本中"垃圾优先"(G1)收集器的官方状态如何。我希望可以使用G1作为低暂停的GC替代CMS,但前提是我真正相信它的健壮性。 JDK 7发布之前,G1被宣传为一个闪亮的新GC,将取代CMS收集器并成为JDK 7的默认GC。然而,现在随着Oracle JDK 7u1的发布,G...

34得票1回答
JVM G1GC的混合垃圾回收器未能收集到太多的旧区域

我的服务器运行在CentOS 6.7上,使用1.8.0_92版本的Java,并设置GC参数为'-Xms16g -Xmx16g -XX:+UseG1GC'。所以默认的InitiatingHeapOccupancyPercent是45,G1HeapWastePercent是5,G1MixedGCL...

7得票1回答
为什么在使用G1收集器时-XX:+ExplicitGCInvokesConcurrent不是默认设置?

在内存数据库的上下文中,我们使用离堆内存来配合 hotspot 的 G1 收集器。然而,当离堆内存使用量达到 MaxDirectMemorySize 时,JDK 代码会使用 System.gc() 触发一次完整的 GC。这导致了长时间且痛苦的停顿,同时似乎将所有当前的活动对象都放入老年代,绕过...

7得票2回答
Java的G1垃圾收集器中的类卸载(Class Unloading)

在Java 6中,我们通常使用以下GC配置来防止应用程序多次重部署后引起的Perm Gen OutOfMemoryException: -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled 我们正在迁移到Java 7,并希望使用新的G1...