jvm 调优
1、查看进程 jvm 状态
查看进程 pid
1 | jps |
查看 jvm 分布
1 | jmap -heap <pid> |
2、参数设置
- -Xms 初始内存
- -Xmx 最大内存
- -Xmn 新生代内存
Xms与Xmx 最好一样,避免内存波动。单击可设置为物理内存的80%
Xmn 最好不要太大,会影响老生代,Sun官方推荐配置为整个堆的3/8
-Xss128k 每个线程大小
-XX:NewRatio=4 年轻与年老大比值。4为 1:4,表示年轻代占比1/5。
1)年轻代大小选择
- 响应时间优先的应用:尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。
在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
- 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。
因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
2)年老代大小选择
响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率和会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:
- 并发垃圾收集信息
- 持久代并发收集次数
- 传统GC信息
- 花在年轻代和年老代回收上的时间比例
- 减少年轻代和年老代花费的时间,一般会提高应用的效率
3)吞吐量优先的应用
一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
参考
https://fjding.iteye.com/blog/2319808
https://github.com/crossoverJie/JCSprout/blob/master/MD/MemoryAllocation.md