我们将并行gc与1.7.0_71一起使用。
java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=258222272 -XX:MaxHeapSize=4131556352 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseParallelGC
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud)
在适当的负载下,每隔几分钟我们就会在应用程序中看到大量垃圾的产生。次要gc每隔几秒钟触发一次,主要gc每2分钟触发一次。通过分析,我们发现堆中剩余了180万个大小为173K的char数组对象。次要gc无法恢复它们。在获取heapdump时,我们在Eclipe MAT的其余部分中找到了许多对象。MAT直方图显示了许多char数组(它们是呈现为html的),但是无法访问所有传入引用和char数组的gc根的合并路径,但是只有完整的GC才能恢复它们,而较小的GC则无法恢复。当没有引用的对象时,为什么次要GC无法恢复它们?附有Eclipse MAT图片。请查看所有引用均不可用。
有一些对请求对象的引用,通过设置null清除它们。
在修复之前,有对HttpServletRequest对象的悬挂引用。
与该问题相关的所有图像:https :
//www.dropbox.com/sh/qgsitzb7x27j8kc/AABoQwR1qPwTPiDtO6B0_Pm7a?dl=0
整体堆

堆直方图视图
现在的问题是
您是否认为这与垃圾收集器有关?我们将JBoss 7.1.1升级到Wildfly 8.2.0.Final。gc策略和JDK版本未更改。为什么gc不能在指向不可访问引用的地方回收内存。
我们可以将XX:NewRatio减小为1。但是,由于全gc经常发生,因此我们不确定这是否会起作用
您认为转用G1 GC会有所帮助吗?吞吐量会降低吗?G1 GC的最佳选择是什么。我们的堆大小-Xms:1024m,-Xmx 2048m Perm gen 512m我们没有看到内存泄漏,没有内存不足错误。附加完整的gc日志输出
2015-05-10 19:32:41 IST| 459.939: [Full GC [PSYoungGen: 8123K->0K(680960K)] [ParOldGen: 782136K->359065K(766464K)] 790260K->359065K(1447424K) [PSPermGen: 202932K->202930K(441344K)], 1.0738240 secs] [Times: user=3.37 sys=0.01, real=1.07 secs]
2015-05-10 19:32:42 IST| 462.306: [GC [PSYoungGen: 672768K->10534K(685056K)] 1031833K->369600K(1451520K), …Run Code Online (Sandbox Code Playgroud)