在2个连续的完整GC循环中未清除存储器

时间:2014-03-14 14:56:19

标签: java garbage-collection jvm java-7

无法理解垃圾收集器在这里做了什么,我只能看到3个完整的GC循环,只有第一个循环清除了一些内存,其他2个循环的内存没有被清除,它仍然在每个循环中花了16秒。

1189.994: [GC1189.994: [ParNew: 446787K->22515K(471872K), 0.1136668 secs] 1408852K->990343K(4141888K), 0.1144236 secs] [Times: user=0.87 sys=0.01, real=0.11 secs] 
1204.825: [Full GC1204.826: [CMS: 967828K->695710K(3670016K), 20.8721088 secs] 1192388K->695710K(4141888K), [CMS Perm : 133862K->133237K(524288K)], 20.8732268 secs] [Times: user=20.81 sys=0.13, real=20.87 secs] 
1225.703: [Full GC1225.703: [CMS: 695710K->695710K(3670016K), 16.7364748 secs] 695716K->695710K(4141888K), [CMS Perm : 133237K->133237K(524288K)], 16.7373018 secs] [Times: user=16.77 sys=0.01, real=16.74 secs] 
1242.444: [Full GC1242.444: [CMS: 695710K->695710K(3670016K), 16.4691631 secs] 695727K->695710K(4141888K), [CMS Perm : 133237K->133237K(524288K)], 16.4698573 secs] [Times: user=16.51 sys=0.02, real=16.47 secs] 
1283.740: [GC1283.741: [ParNew: 419456K->33117K(471872K), 0.1520895 secs] 1115166K->728827K(4141888K), 0.1531085 secs] [Times: user=1.06 sys=0.01, real=0.15 secs]

每天我在gc.log中看到这个,并且每次都没有使用2个周期。

vm参数

java -server -Xms4096m -Xmx4096m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:MaxNewSize=512m -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+UseMembar -d64 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:GC.log -classpath ......

可用处理器(核心):16

编辑: 我想删除MaxNewSize参数,因为它现在是总堆的1/8部分。我在几篇文章中读到它应该是总堆的1/3到1/4。但我得到适当的解释,年轻一代(MaxNewSize)将如何影响GC。

2 个答案:

答案 0 :(得分:0)

听起来对象仍处于活动状态,并且仍然有链接。您可以通过在声明和初始化对象/变量的位置移动来解决此问题。这并不总是可行的,因为它可能会影响程序的运行。请记住,垃圾收集并不总是释放空间,它只释放可以释放的空间。

您是否认为应该释放空间?您是手动触发垃圾收集器还是只是自动运行它?

答案 1 :(得分:0)

查看GC日志,我想到的一些事情

  1. 在这种情况下,旧的十个不超过3 GB的695 MB。为什么GC会触发?很少有GC循环运行但不收集任何来自烫发或旧发的东西。可能是由于手动触发?记住当旧的gen堆有碎片时(因此难以升级)或者InitiatingHeapOccupancyPercent设置得太低,GC运行完全。对于某些JVM,默认值为45。您可以将其设置为-XX:+ InitiatingHeapOccupancyPercent = 70