JVM 基础参数及概念

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_29694039/article/details/78275034

————————
JVM 参数
————————

PermGen space:全称是Permanent Generation space。就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域。Heap space:存放Instance。
GC(Garbage Collection)应该不会对PermGen space进行清理。所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误Java Heap分为3个区,Young,Old和Permanent。
Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。
Permanent区则负责保存反射对象。

以下为常用参数及释义

  • -Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
  • -Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制
  • -XX:PermSize 设置持久代(perm gen)初始值 物理内存的1/64
  • -XX:MaxNewSize 年轻代最大值(for 1.3/1.4)
  • -XX:MaxPermSize 设置持久代最大值 物理内存的1/4
  • -Xss 每个线程的堆栈大小

JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右 一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。
和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:”-Xss is translated in a VM flag named ThreadStackSize”。一般设置这个值就可以了。

GC性能方面的考虑

对于GC的性能主要有2个方面的指标:吞吐量throughput(工作时间不算gc的时间占总的时间比)和暂停pause(gc发生时app对外显示的无法响应)。

  1. Total Heap

    默认情况下,vm会增加/减少heap大小以维持free space在整个vm中占的比例,这个比例由MinHeapFreeRatio和MaxHeapFreeRatio指定。
    一般而言,server端的app会有以下规则:
    对vm分配尽可能多的memory;
    一般将Xms和Xmx设为一样的值。如果虚拟机启动时设置使用的内存比较小,这个时候又需要初始化很多对象,虚拟机就必须重复地增加内存。
    (没必要完全按照规则设置,要理解初始堆空间的作用。个人建议还是要小于Xmx的)
    处理器核数增加,内存也跟着增大。

  2. The Young Generation

    另外一个对于app流畅性运行影响的因素是young generation的大小。young generation越大,minor collection越少;但是在固定heap size情况下,
    更大的young generation就意味着小的tenured generation,就意味着更多的major collection(major collection会引发minor collection)。
    NewRatio反映的是young和tenured generation的大小比例。NewSize和MaxNewSize反映的是young generation大小的下限和上限,
    将这两个值设为一样就固定了young generation的大小(同Xms和Xmx设为一样)。
    如果希望,SurvivorRatio也可以优化survivor的大小,不过这对于性能的影响不是很大。SurvivorRatio是eden和survior大小比例。

一般而言,server端的app会有以下规则:

首先决定能分配给vm的最大的heap size,然后设定最佳的young generation的大小;
如果heap size固定后,增加young generation的大小意味着减小tenured generation大小。
让tenured generation在任何时候够大,能够容纳所有live的data(留10%-20%的空余)。

猜你喜欢

转载自blog.csdn.net/qq_29694039/article/details/78275034