年轻代大小的选择
- 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到老年代的对象。
- 吞吐量优先的应用:尽可能地设置大,可能达到Gbit的程度。因为对响应时间没有要求,垃圾收集器可以并行进行,一般适合8个cpu以上的应用。
老年代大小的选择
-
响应时间优先的应用:老年代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了 ,可能会造成内存碎片,高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
- 并发垃圾收集信息
-
持久代并发收集次数
-
传统GC信息
-
花在年轻代和老年代花费的时间,一般会提高应用的效率
较少年轻代和老年代花费的时间,一般会提高应用的效率 -
吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的老年大。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而老年代尽存放长期存活对象
最小堆引起的碎片问题:因为老年代的并发收集器使用标记,清除算法,所以不会对堆进行压缩。当收集器回收时,它会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现碎片,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记,清除方式进行回收。如果出现碎片,可能需要进行如下配置 :- -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对老年代的压缩。
- -XX:CMSFullGCBeforeCompaction=0:上面配置开启的情况下,这里设置多少次FullC后,对老年代进行压缩