JVM 垃圾回收经验 https://my.oschina.net/u/2950586/blog/776727

 

优化经验:

  1. 年轻代选择。避免设置过小,当新生代设置过小时会导致,YGC次数更加频繁,可能导致YGC对象直接进入年老代,如果此时年老代满了,会容易触发Full GC;
  2. 年老代选择。年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数,如果堆设置小了,可以会造成内存碎 片,高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间,最优化的方案,一般需要参考并发垃圾收集信息、持久代并发收集次数、传统GC信息、花在年轻代和年老代回收上的时间比例;
  3. Xms和Xmx设置一样大,MaxPermSize和MinPermSize设置一样大,这样可以减轻伸缩堆大小带来的压力;
  4. 较小堆引起的碎片问题,因为年老代的并发收集器使用标记清除算法,所以不会对堆进行压缩.当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象,但是当堆空间较小时,运行一段时间以后,就会出现”碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收,如果出现”碎片”,可能需要进行如下配置:
    -XX:+UseCMSCompactAtFullCollection // 使用并发收集器时,开启对年老代的压缩
    -XX:CMSFullGCsBeforeCompaction=0 // 设置多少次Full GC后,对年老代进行压缩
  5. 使用CMS要注意初始标记和重新标记,因为这两个阶段是STW,一般在初始标记和重新标记前都会进行YGC,在重新标记前保证preclean下,保证重新标记不会太耗时。

优化配置:

优化主要借鉴垃圾回收日志,主要查看YGC和FGC的频率和时长,如果YGC和FGC过于频繁可能是年轻代和Survivor区过小,CMS FGC一定要注意1和4两个两个阶段,这两个阶段是STW的,在初始标记前进行YGC和在重新标记前充分的preclean都可以提高效率。