Jvm 常见配置参数


查看命令: java -XX:+PrintCommandLineFlags -version


java8去掉了-XX:PermSize 和 -XX:MaxPermSize ,新增了 -XX:MetaSpaceSize 和 -XX:MaxMetaSpaceSize

-Xmx5g : 设置堆最大内存为5G , 大小可变化。

-Xms5g : 设置堆最小内存为5G , 大小可变化。

-Xmn2g : 设置堆中的年轻代大小为2G。整个堆大小=年轻代大小+老年代大小+持久代大小。持久代一般固定位64M,所以增大年轻代后,将会减少老年代大小,当老年代内存用完会引发Full GC,相当严重。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

-XX:SurvivorRatio=8 : 设置年轻代中Eden区与一个Survivor区的比例为8:1,默认为8

-XX:NewRatio=2: 设置老年代和年轻代比例大小2:1,默认为2

-Xss128k: 设置每个线程的栈大小

-XX:PermSize -XX:MaxPermSize: 设置永久代大小,jvm启动时,永久区一开始就占用了PermSize大小的空间,如果空间还不够,可以继续扩展,但是不能超过MaxPermSize,否则会OOM PermSiz space

-XX:MetaspaceSize -XX:MaxMetaspaceSize(JDK1.8): 设置元空间的初始值和最大值

-XX:MaxDirectMemorySize=10M: 设置直接内存大小,如果不指定,则默认与Java堆最大值(-Xmx)一样。NIO操作会占用直接内存,因此大量的NIO操作可能引起直接内存溢出:Direct buffer memory

-XX:PretenureSizeThreshold=3145728: 表示超过3M的数据直接在老年代中保存

-XX:MaxTenuringThreshold=30 : 设置年轻代中的对象存活多少次Minor GC后进入老年代。如果设置为0的话,则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概率。设置为30表示一个对象如果在Survivor空间移动30次还没有被回收就放入年老代。

-XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置

-XX:ParallelGCThreads=8: 配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等

-XX:+PrintGCTimeStamps: 打印GC停顿时间,一般测试用

-XX:+PrintGCDetails: -XX:+PrintGCDetails:打印GC详细日志,一般测试用

如果满足下面的指标,则一般不需要进行GC优化:

  • Minor GC 执行时间不到50ms
  • Minor GC 执行不频繁,约10秒一次
  • Full GC 执行时间不到1s
  • Full GC执行频率不算频繁,不低于10分钟1次