Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 禁用AdaptiveSizePolicy时出现并行垃圾收集器问题_Java_Garbage Collection_Jvm_Jvm Hotspot - Fatal编程技术网

Java 禁用AdaptiveSizePolicy时出现并行垃圾收集器问题

Java 禁用AdaptiveSizePolicy时出现并行垃圾收集器问题,java,garbage-collection,jvm,jvm-hotspot,Java,Garbage Collection,Jvm,Jvm Hotspot,我正在对并行GC进行一些试验,基本上我试图将幸存者空间大小设置为在以前的运行中观察到的最大值,以避免幸存者空间溢出。在我的情况下,一个96mX2大小的幸存者应该可以。为了避免jvm调整幸存者空间的大小,我关闭了AdaptiveSizePolicy 很明显,我遗漏了一些东西,因为我在应用程序上的负载非常小的情况下得到了不断的溢出,但仍然是一个奇怪的溢出,因为旧的一代空间在溢出时似乎没有增加 以下是Java 1.7.0_51 jvm上的jvm参数: java-D[Standalone]-server

我正在对并行GC进行一些试验,基本上我试图将幸存者空间大小设置为在以前的运行中观察到的最大值,以避免幸存者空间溢出。在我的情况下,一个96mX2大小的幸存者应该可以。为了避免jvm调整幸存者空间的大小,我关闭了AdaptiveSizePolicy

很明显,我遗漏了一些东西,因为我在应用程序上的负载非常小的情况下得到了不断的溢出,但仍然是一个奇怪的溢出,因为旧的一代空间在溢出时似乎没有增加

以下是Java 1.7.0_51 jvm上的jvm参数:

java-D[Standalone]-server-XX:+UseCompressedOops-Xms3328m-Xmx3328m -Xmn1152m-XX:SurvivorRatio=10-XX:PermSize=132m-XX:MaxPermSize=132m-XX:+UseParallelOldGC-XX:-UseAdaptiveSizePolicy-XX:+PrintGCDetails-XX:+PrintGCDateStamps-XX:+PrintAdaptiveSizePolicy-Xloggc:/usr/local/java/jboss/standalone/log/gc.log

这些是垃圾收集日志

2014-02-10T09:56:26.104+0200:39544.174: [GCAdaptiveSizePolicy::计算幸存者空间大小和阈值: 幸存:100636800升级:10963760溢出:真[PSYoungGen: 1081318K->98278K(1081344K)]1869646K->897313K(3309568K),0.1578000 秒][时间:用户=0.57秒系统=0.03,实际=0.16秒]

2014-02-10T10:02:24.729+0200:39902.799: [GCAdaptiveSizePolicy::计算幸存者空间大小和阈值: 幸存:100648968升级:19202536溢出:真 1081318K->98290K(1081344K)]1880353K->916077K(3309568K),0.1893170 秒][时间:用户=0.64秒系统=0.09,实际=0.19秒]

这里,旧世代的堆占用率增加了19m,而不是96m(幸存者空间的大小)。依此类推其余日志。

2014-02-10T10:05:17.796+0200:40075.866: [GCAdaptiveSizePolicy::计算幸存者空间大小和阈值: 幸存:100623664升级:1384448溢出:假[PSYoungGen: 1081330K->98265K(1081344K)]1899117K->917405K(3309568K),0.1350010 秒][时间:用户=0.51秒系统=0.01,实际=0.13秒]

2014-02-10T10:07:56.135+0200:40234.204: [GCAdaptiveSizePolicy::计算幸存者空间大小和阈值: 幸存:100650360升级:19069104溢出:真[PSYoungGen: 1081305K->98291K(1081344K)]1900445K->936053K(3309568K),0.1847340 秒][时间:用户=0.64系统=0.08,实际=0.18秒]

2014-02-10T10:08:26.613+0200:40264.682: [GCAdaptiveSizePolicy::计算幸存者空间大小和阈值: 幸存:100658976升级:12245304溢出:真[PSYoungGen: 1081331K->98299K(1081344K)]1919093K->948020K(3309568K),0.1578130 秒][时间:用户=0.57秒系统=0.04,实际=0.16秒]


所以问题是:我错过了什么?为什么这么多的物体似乎存活了下来?启用AdaptiveSizePolicy后,在相同负载下的存活率非常低。

经过更多的实验,我想我已经找到了答案

首先,并行GC只溢出到旧一代幸存者空间之上的内容,而不是我在问题中错误陈述的整个幸存者空间

其次,禁用AdaptiveSizePolicy时,有效期阈值默认为2或更多,值大于1(AdaptiveSizePolicy在几乎没有发生溢出的99%情况下计算的值)。因此,在每一个小收藏中,GC都试图将第一个幸存者空间中的生物复制到第二个幸存者空间中,但这里没有足够的空间(还有来自伊甸园的生物需要容纳),因此它会溢出到老一代。

将初始有效期阈值和最大有效期阈值设置为1可防止持续溢出,同时保持幸存者空间足够大,正如我最初预期的那样:

java-D[Standalone]-server-XX:+UseCompressedOops-Xms3328m-Xmx3328m -Xmn1152m-XX:SurvivorRatio=10-XX:PermSize=132m-XX:MaxPermSize=132m-XX:+UseParallelOldGC-XX:-useAptiveSizePolicy-XX:initialTenuringReshold=1-XX:maxtenuringReshold=1-XX:+PrintGCDetails-XX:+PrintGCDateStamps-XX:+PrintAdaptiveSizePolicy-Xloggc:/usr/local/java/jboss/standalone/gc/gc.log

以下是启用时AdaptiveSizePolicy打印的日志:

2014-02-12T20:31:28.967+0200:74464.855: [GCAdaptiveSizePolicy::计算幸存者空间大小和阈值: 幸存:21423336升级:4189088溢出: 错误

AdaptiveSizeStart:74464.928系列:250
平均存活率平均填充率平均值:35720128.000000平均升级率平均填充率平均值: 21338244.000000平均值预拉伸平均值0.000000固定平均值阈值:1目标尺寸: 36175872PS

有趣的是,与老一代的持续溢出相比,1的老化在应用程序性能上有很大的不同,主要是在较小的收集时间,但完整GC频率也较小