无法理解垃圾收集器在这里做了什么,我只能看到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。
答案 0 :(得分:0)
听起来对象仍处于活动状态,并且仍然有链接。您可以通过在声明和初始化对象/变量的位置移动来解决此问题。这并不总是可行的,因为它可能会影响程序的运行。请记住,垃圾收集并不总是释放空间,它只释放可以释放的空间。
您是否认为应该释放空间?您是手动触发垃圾收集器还是只是自动运行它?
答案 1 :(得分:0)
查看GC日志,我想到的一些事情