JVM 参数参考官网: www.oracle.com/java/techno…
一般项目主要是调整(年轻代、老年代、元空间的内存空间大小、使用的垃圾回收器类型):
- 设置堆空间大小
- 虚拟机栈设置
- 年轻代中Eden区和两个Survivor区的大小比例
- 年轻代晋升老年代阈值
- 设置垃圾回收收集器
设置堆空间大小
设置堆的初始大小和最大大小,为了防止垃圾收集器在初始大小和最大大小之间收缩而产生额外的时间,通常把最大、初始大小设置为相同值。
-Xms:设置堆的初始大小
-Xmx:设置堆的最大大小
-Xms:1024
-Xms:1024k
-Xms:1024m
-Xms:1g
若不指定单位,则默认为字节
设置多少合适?
- 最大大小的默认值是物理内存的1/4,初始大小是物理内存的1/64
- 堆太小,可能会频繁的导致年轻代和老年代的垃圾回收,产生STW,暂停用户线程
- 堆内存大肯定好,存在风险,假如发生full GC,它会扫描整个堆内存,暂停用户线程的时间长
- 设置参考推荐:尽量大,也要考察一下当前计算机其他程序的内存使用情况
虚拟机栈设置
每个线程默认会开启1M的内存,用于存放栈帧、调用参数、局部变量等,但一般256k就够用,通常减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。
-Xss 对每个线程stack大小的调整,-Xss128k
年轻代中Eden区和两个Survivor区的大小比例
设置年轻代中Eden区和两个Survivor区大小比例。如果不设置默认是8:1:1。通过增大Eden区的大小,来减少YGC发生的次数,但有时候我们发现,虽然次数减少了,但Eden区满的时候,由于占用的空间较大,导致释放缓慢,此时STW的时间较长,因此需要按照程序情况去调优
-XXSurvivorRatio=8(表示年轻代中的分配比率:survivor:eden=2:8;就是eden占8份from和to各占用一份)
年轻代晋升老年代阈值
-XX:MaxTenuringThreshold=15
取值范围0至15
设置垃圾回收收集器
JDK8默认垃圾回收器
-XX:+UseParallelGC
-XX:+UseParallelOldGC
也是可以设置为G1 -XX:+UseG1GC