1. JVM的GC参数:
-Xms : 初始堆大小6G
-XX : CMSInitiatingOccupancyFraction=65 :年老代空间使用率到65%就执行CMS GC。从70调整为65,让old区尽早的进行回收,可以保证年老代能及时回收垃圾,保证空间充足可以接纳新声代对象。
2.堆内存heap
年轻代(Young Generation)、老年代(Old Generation)和持久代(Permanent Generation)
(1)年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。 一个eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。
(2)年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
(3)持久代:
用于存放静态文件,如今Java类、方法等。
2.内存回收触发:
(1)Young GC:
条件:eden满了。只整理回收young gen
(2)CMS GC:全称 Concurrent Low Pause Collector
条件:old Gen的使用率大于一定的比率,默认为92%。在并发模式工作的时候只整理回收old gen。
(3)Full GC:(Full GC很影响系统性能)
条件:
年老代满了;
持久代满了;
【CMS GC出现promotion failed(年轻代晋升到年老代空间不足)和concurrent mode failure(并发失败)。Full GC将对整个堆进行整理。 】
另外:年轻代满了的Y GC又称为Minor GC。年老代满了的Full GC又称为Major GC。
总之:
因为young GC只收集young gen,但full GC会收集整个GC堆。
HotSpot VM的full GC会收集整个Java堆,包括其中的young gen与old gen;同时也会顺便收集不属于Java堆的perm gen。
Young + old + perm构成了HotSpot VM的整个GC堆。至少目前还是这样。
(JDK8里的HotSpot VM就没有perm gen了。请注意。)
CMS在并发模式工作的时候是只收集old gen的。但一旦并发模式失败(发生concurrent mode failure)就有选择性的会进行全堆收集,也就是退回到full GC。
如果young gen太小,每次满了就触发一次young GC。
即:young gen满了,就会触发young GC。 old gen满了,就会触发CMS GC。
3. 查看回收情况:
jstat命令:
查看GC:
sudo jstat -gcutil resin进程号 1000 -1
字段含义: