一、JVM参数类型
java
命令支持多种参数选项,可以分为三种类别:1.标准选项参数 2.非标准选项参数(-X
开头) 3.高级选项参数(-XX
开头)
1.标准选项参数
- Java虚拟机(JVM)的所有实现都保证支持标准选项。它们用于常见操作,例如检查JRE版本、设置类路径、启用详细输出等.
- 例子:
-version
,-help
,-Dproperty=value
(设置系统属性值-Dfoo="foo bar"
)
2.非标准选项参数
- 非标准选项是特定于Java HotSpot虚拟机的通用选项,因此不能保证所有JVM实现都支持这些选项,并且可能会发生更改。这些选项以
-X
开头. - 例子:
-Xms1g
-Xmx2g
-Xss64m
3.高级选项参数
-
高级选项是针对开发人员,用于调整Java HotSpot虚拟机操作的特定区域,这些区域通常具有特定的系统要求,并且可能需要对系统配置参数进行特权访问。它们也不能保证得到所有JVM实现的支持,并且可能会发生变化。高级选项以
-XX
开头。可以再细分为:1.运行时选项参数 2.JIT 编译选项 3.服务信息选项 4.垃圾回收选项。-XX:+
和-XX:-
分别表示开启/关闭某个属性。 -
1.运行时选项参数 :
-XX:MaxDirectMemorySize=256m
-
2.JIT 编译选项 : 该参数类型比较少用到
-
3.服务信息选项:
-XX:+HeapDumpOnOutOfMemoryError
,-XX:HeapDumpPath=/logs/
-
4.垃圾回收选项:
-XX:MaxMetaspaceSize=256M
,-XX:+UseG1GC
二、配置建议
- Xms 与Xmx 设置成一样大,可以减轻伸缩堆大小带来的压力,一般是FullGC后已占堆大小的3-4倍
- 优先使用JVM的默认配置,因为随着JVM的不断发展演进,会越来越智能化,比如JDK1.8默认垃圾额回收器默认启动
UseAdaptiveSizePolicy
,自动选择年轻代区大小和相应的Survivor区比例 - 配置GC日志打印,方便快速排错
参考例子:
- JDK 1.8
-Xms2G -Xmx2G -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:/logs/myGC.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/
- JDK1.9以上(包含JDK1.9)
-Xms2G -Xmx2G -Xlog:gc*=info,gc+heap=debug,gc+age=trace,safepoint:/logs/gc_%t.log:time,level,tags:filecount=5,filesize=20m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/
从上面例子对比,可以看出,JDK1.8及更早版本,设置gc日志显得比较麻烦,JDK1.9开始,统一使用一个Xlog 参数来设置gc日志打印。详细对比参考官网:https://docs.oracle.com/en/java/java-components/enterprise-performance-pack/epp-user-guide/printing-jvm-information.html
-Xlog
-Xlog是JDK1.9引入的日志服务,用于将JVM中的各种事件统一起来,以统一的形式对外输出
java -Xlog:help //查看参数所有所有选项
格式如下:
-Xlog[:[selections][:[output][:[decorators][:output-options]]]]
详细参数选项说明:https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-BE93ABDC-999C-4CB5-A88B-1994AAAC74D5
三、常用设置大全
参数 | 含义 | 默认值 | 说明 |
---|---|---|---|
-Xms | 初始堆大小 | 物理内存的1/64 | |
-Xmx | 最大堆大小 | 物理内存的1/4 | |
-Xss | 每个线程栈的大小 | 在相同物理内存下,减小这个值能生成更多的线程,操作系统对一个进程内线程数有限制,等同于-XX:ThreadStackSize
|
|
-Xmn | 新生代大小 | 与-XX:NewSize 设置新生代大小和 -XX:MaxNewSize 新生代最大值含义一致,推荐使用-Xmn
|
|
-XX:MaxMetaspaceSize | 设置元空间最大值 | 默认值是-1 | JDK1.8之前是永久代的概念,参数是-XX:MaxPermSize , |
-XX:MetaspaceSize | 设置元空间初始值 | 默认值是21M | JDK1.8之前是永久代的概念,参数是 -XX:PermSize
|
-XX:MaxDirectMemorySize | 最大直接内存大小 | -1 | JDK1.8开始支持的参数 |
-XX:NewRatio | 老年代与新生代的比值 | 默认值2 | 新生代(包括Eden和两个Survivor区) |
-XX:SurvivorRatio | Eden区与Survivor区的大小比值 | 默认值8 | 设置为8,则两个Survivor区与一个Eden区的比值为2:8 |
-XX:PretenureSizeThreshold | 对象超过多大是直接在老年代分配 | 默认值0(先在新生代创建) | 新生代采用Parallel Scavenge GC时无效 |
-XX:MaxTenuringThreshold | 垃圾最大年龄 | 默认值15 | 如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代 |
-XX:PrintCommandLineFlags | 启动的时候打印JVM参数 | 默认关闭 | |
-XX:-UseBiasedLocking | 不启动偏向锁 | 默认启用 | JDK1.6开始支持偏向锁,默认启用 |
-XX:+AggressiveOpts | 启动性能优化参数 | 默认关闭 | 优化功能参数是属于实验性功能,预计将在即将发布的版本中成为默认功能 |
-XX:+DisableExplicitGC | 关闭System.gc() | 默认启动 | |
-Xnoclassgc | 禁用类垃圾回收 | 默认关闭 | |
-XX:ParallelGCThreads | 并行收集器的线程数 | 此值最好配置与处理器数目相等 | |
-XX:+UseAdaptiveSizePolicy | 自动选择年轻代区大小和相应的Survivor区比例 | UseParallelGC垃圾收集器默认启动了AdaptiveSizePolicy | |
-XX:MaxGCPauseMillis | 垃圾回收的最长时间(最大暂停时间ms) | 软目标,JVM尽力调整配置达到 | |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 | 默认值99,即1% | 公式为1/(1+n) |
垃圾收集器:
参数 | 含义 | 默认值 | 说明 |
---|---|---|---|
-XX:+UseSerialGC | 设置串行收集 | 年轻代和老年代都是串行垃圾收集 | |
-XX:+UseParNewGC | 设置年轻代为并行收集 | 可与CMS收集同时使用,默认老年代Serial Old | |
-XX:+UseConcMarkSweepGC | 设置老年代CMS收集 | 默认新生代-XX:+UseParNewGC,JDK14已移除 | |
-XX:+UseParallelGC | 设置新生代Parallel Scavenge回收器 | 默认老年代使用Parallel Old收集器 | |
-XX:+UseParallelOldGC | 设置老年代Parallel Old收集器 | 默认新生代使用Parallel Scavenge | |
-XX:+UseG1GC | 设置G1收集器 | JDK1.9开始默认的垃圾收集器 |
GC日志打印配置:
参数 | 含义 | 默认值 | 说明 |
---|---|---|---|
-XX:+PrintGC | 打印GC日志 | 默认关闭 | |
-XX:+PrintGCDetails | 打印GC详细日志 | 默认关闭 | |
-XX:+PrintGCTimeStamps | 打印GC详细日志 | 默认关闭 | |
-XX:+PrintGCDateStamps | 打印GC详细日志 | 默认关闭 | |
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间 | 默认关闭 | |
-XX:+PrintHeapAtGC | 打印GC前后的详细堆栈信息 | 默认关闭 | |
-XX:+PrintTenuringDistribution | 每次minor GC后新的存活周期的阈值 | 默认关闭 | |
-Xloggc:filename | 日志信息记录到指定文件 | ||
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间 | 默认关闭 | |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间 | 默认关闭 | |
-XX:+PrintClassHistogram | 打印类的信息 | 默认关闭 |
上述大部分参数在JDK1.9已移除,改用
-Xlog
参数 | 含义 | 默认值 | 说明 |
---|---|---|---|
-Xlog | 统一GC日志打印配置参数 | JDK1.9开始,取替JDK1.9之前繁多GC日志打印参数 |
详细官网参考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html
网友评论