一、JVM参数大致可以分为三类
1、标准指令:-
开头,这些所有的HotSpot都支持的参数,可以用java -help
打印出来.
-
-verbose:gc
:输出每次GC的相关情况 -
-verbose:class
:用于输出jvm载入类的相关信息,当jvm报告说找不到类或者类冲突时可此进行诊断 -
-verbose:jni
:输出native方法调用的相关情况,一般用于诊断jni调用错误信息
2、非标准指令:-X
开头,这些指令通常是跟特定的HotSpot版本对应的,可以用java -X
打印出来
3、 不稳定参数:-XX
开头,这一类参数是跟特定的HotSpot 版本对应,并且变化比较大,不推荐生产环境使用。
如果你想查看当前应用使用的JVM参数,你可以使用:ManagementFactory.getRuntimeMXBean().getInputArguments();
二、常用的参数介绍:
-Xms512m
:设置JVM初始内存为512m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmx512m 或-XX:MaxHeapSize=512m
:设置JVM最大可用内存为512M
-Xmn200m或-XX:NewSize=size + -XX:MaxNewSize=size
:设置年轻代大小为200M。此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是(eden+1 survivor space)不同的。
-XX:InitialSurvivorRatio=ratio + -XX:+UseAdaptiveSizePolicy
:幸存区比例(动态)
-XX:SurvivorRatio=ratio
:幸存区比例
-XX:MaxTenuringThreshold=threshold
:晋升阈值,新生代晋升到老年代的晋升阈值
-XX:+PrintTenuringDistribution
:晋升详情
-XX:+ScavengeBeforeFullGC
:FullGC前MinorGC
-XX:+UseSSerialGC
:指定垃圾回收器
-XX:MaxMetaspaceSize=8m
:设置元空间内存最大值。因为jdk1.8以后元空间使用本地内存,容易导致当前进程内存占用过多
-XX:MaxPermSize=8m
:设置永久代内存最大值
-XX: +PrintStringTableStatistics
:打印StringTable的字符串统计信息,比如个数等
-XX: +PrintGCDetails -verbose:gc
:打印垃圾回收的详细信息
-XX:StringTableSize=200000
:设置StringTable的bucket,最少1009,默认jdk8是60013,jdk6是1009.如果系统中字符串较多,则考虑适当的将该值设置的大一些.here is the java 8 release notes nothing seem to be about String.intern . Here is little difference : The default value of -XX:StringTableSize parameter is 1009 in Java 6 and Java 7 until Java7u40. It was increased to 60013 in Java 7u40 (same value is used in Java 8 as well).
-XX:+DisableExplicitGC
:禁用显示的垃圾回收,也就是代码中的System.gc();
无效。System.gc();
显示的垃圾回收,触发比较耗费性能的full GC。如果开启了该功能,会导致Java没有及时触发垃圾回收,从而ByteBuffer对象无法释放,而无法释放直接内存
当运行一个空方法,并设置堆内存20M,使用SerialGC垃圾回收器,并打印垃圾回收详细信息
JVM参数.png
还是上面的参数,将一个7M的数据放入List集合,结果如下:
垃圾回收minor-分析.png
大对象晋升:当老年代控件足够,新生代空间不够的情况下,大对象会直接晋升,存入老年代,不触发垃圾回收。
当新生代与老年代空间均不够,会触发fullgc。
后面的参数与gc类似。
jvm-老年代.png
子线程内存溢出不会导致主线程结束
子线程内存溢出不会导致主线程结束.png
网友评论