JVM的参数分类
-
标准参数 属于JVM的标准参数 如常用的-version -help -server等
-
-X类型参数 如-Xms -Xmx -Xss等也对应有-XX的参数
-
-XX类型参数 容易产生变化的参数也是功能最多的参数 又可以细分布尔型和赋值性 如-XX:+PrintGCDetails intGCDetails 或者 -XX:NewRatio=2
常用的JVM参数
JDK8 的JVM参数官网
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
打印类
- -XX:+PrintCommandLineFlags打印java进程的启动JVM参数
- -XX:+PrintFlagsInitial 打印所有JVM初始参数
- -XX:+PrintFlagsFinal 打印所有JVM最终的参数 如果有修改会在前面有一个冒号:
堆栈类
-
-Xss128k 设置每个线程栈大小为128K 等价于-XX:ThreadStackSize=128k
-
-Xms4g 设置JVM初始堆内存为4G 等价于 -XX:InitalHeapSize=4G
-
-Xmx4g 设置JVM最大堆内存为4g 等价于-XX:MaxHeapSize=4G 实际中为了避免JVM扩容缩小heap空间的性能损失建议 -Xms 和 -Xmx大小设置一样
-
-Xmn2g 设置年轻代大小为2G 官方推荐为整堆大小3/8
-
-X:NewSize=1024m 设置年轻代初始大小为1024M
-
-XX:MaxNewSize=1024m 设置年轻代最大1024M
-
-XX:SurvivorRatio=8 设置年轻代Eden:Suvivor为8:1:1 默认为8
-
-XX:+UseAdptiveSizePolicy 是否开启JVM自动优化堆分配 因为开启该选项可能Eden:Suvivor不是8:1:1 生产建议关闭
-Xms600m -Xmx600m 的情况下计算 600*1/3=200m 200m-> Eden->160m S0/S1->20m,但此时jmap方法并不是满足8:1:1 此时是因为设置了UseAdptiveSizePolicy设置了JVM自动优化策略
如果需要显示制定需要-XX:-UseAdptiveSizePolicy 和 -XX:SurvivorRatio=8 显示执行
-
-XX:NewRatio=4 设置老年代与年轻代的比例 默认2 年轻代1/3 老年代2/3
-
-XX:PretenureSizeThreadhold=1024 设置大于某一个阈值直接分配到老年代单位字节只对Serial和ParNew有效
-
-XX:MaxTenuringThreadhold=15 当对象年龄达到15的时候晋升老年代 默认15
-
-XX:+PrintTenuringDistribution 让JVM在每次MinorGC后打印当前使用的Survivor中对象的年龄分布
-
-XX:TargetSurvivorRatio 表示MinorGC结束后Survivor区域中占用空间的期望比例
方法区
JDK8以前
- -XX:PermSize=256m 设置永久代初始大小为256M
- -XX:MaxPermSize=256 设置永久代最大值256M
JDK8以后
- -XX:MetaspaceSize 设置元空间初始大小
- -XX:MaxMetaspaceSize 设置元空间最大值
- -XX:+UseCompressedOops 压缩对象指针
- -XX:+UserCompressedClassPointers 压缩类指针
- -XX:+CompressedClassSpaceSize 设置Klass Metaspace大小默认为1G
直接内存
- -XX:MaxDirectMemorySize 指定直接内存最大值,默认与java堆最大值一样
OOM相关选项
- -XX:+HeapDumpOnOutOfMemoryError 在出现OOM之前生成堆转储文件便于后期分析问题
- -XX:+HeapDumpBeforeFullGC 在FullGC之前生成heap转储文件
- -XX:HeapDumpPath=
指定heap转储文件保存的路径 - -XX:OnOutOfMemoryError 指定一个可执行的程序或者脚本的路径,当发生OOM的时候执行该脚本,一般用于写一个restart.sh的重启脚本 如-XX:OnOutOfMemoryError=/opt/java/restart.sh
GC相关常用配置
JDK8默认的ParalleGC相关
- -XX:+UseParallelGC 手动指定年轻代用ParallelGC 默认激活+UseParallelOldGC
- -XX:+UseParallelOldGC 手动指定老年代用ParallelOldGC 默认激活+UseParallelGC 相互激活关系
- -XX:ParallelGCThreads 设置年轻代并行垃圾收集器线程数,一般最好与CPU数量相等,如果线程数会影响GC性能
- 默认当CPU数量小于8 ParallelGCThreads 的值等于CPU数量
- 当CPU数量大于8个,ParallelGCThreads 的值等于3+[5*CPU_Count/8]
- -XX:MaxGCPauseMillis 设置收集器最大停顿时间(STW时间).单位是毫秒
- 为尽可能把停顿时间控制在MaxGCPauseMills内,GC在工作时会调整java堆或者其他的一些参数
- 用于用户来讲,停顿时间越短体验越好,但是在服务器端,我们注重高并发,整体的吞吐量下降.所以服务端适合Parallel
- 该参数使用需谨慎
- -XX:GCTimeRatio 垃圾收集时间占总时间的比例 1/(N+1),用于衡量吞吐量大小 默认为99 GC占用总运行之间的1%
- 取值范围0-100 默认99 垃圾回收时间不超过1%
- 与-XX:MaxGCPauseMillis 参数有一定的矛盾性
- -XX:+UseAdptiveSizePolicy 设置Parallel Scavenge收集具有自适应调节策略
G1参数
- -XX:MaxGCPauseMillis 期望达到GC最大停顿时间(STW)
- -XX:ParallelGCThread 设置STW时GC线程数最多设置8
- -XX:ConGCThreads 设置并发标记的线程数,将n设置为并行垃圾回收线程数(ParallelGCThreads)的1/4左右
- -XX:InitiatingHeapOccupancyPercent=45 设置触发并发GC周期的java堆占用率阈值.超过此阈值触发GC 默认45
- -XX:G1NewSizePercent -XX:G1MaxNewSizePercent 年轻代占用整个堆内存的最小百分比默认5% 最大百分比默认60% 在JDK8版本中是实验类型参数 需加上-XX:+UnlockExperimentalVMOptions 开启
- -XX:G1ReservePercent=10 保留内存区域 防止Survivor中的to区溢出
GC日志相关参数
- -verbose:gc 输出GC日志信息,默认输出到标准输出
- -XX:+PrintGC 等同于-verbose:gc 表示打开简化的GC日志
- -XX:+PrintGCDetails 在发生垃圾回收时打印内存收集的详细日志并在进程退出时输出当前内存内区域分配情况
- -XX:+PrintGCTimeStamps 输出GC发生的时间戳
- -XX:+PrintGCDateStamps 输出GC发生的时间戳 以英文日期格式
- -XX:+PrintHeapAtGC 每一次GC前和GC后都打印堆信息
- -Xloggc: 将GC日志写入到一个文件中去,而不是打印到标准输出中 如-Xloggc:/var/log/dump/xxx.hprof