jvm 调优

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