简介
- JVM(Java Virtual Machine),顾名思义是Java的虚拟机,是JRE的一部分。
参数说明
java -X 可查看所有X参数
- 堆大小:
1
2
3-Xms(最小)
-Xmx(最大)
-Xmn(新生代大小) - 栈大小:
1
2-Xss(栈容量, 在线程较多的情况, 该值越大越容易内存溢出)
-Xoss(本地方法栈, HotSpot不区分虚拟机栈和本地方法栈, 所以该参数在HotSpot中无效) - 方法区大小: (1.7/1.8 方法区的实现由永久代转换为元空间,字符串常量移动到堆中。元空间并不在虚拟机中,而是使用本地内存。)
1
2
3
4
5
6
7-XX:PermSize
-XX:MaxPermSize
JDK1.8 中 PermSize 和 MaxPermSize 已无效。
-XX:MetaspaceSize
-XX:MaxMetaspaceSize
-XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
-XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集 - 直接内存大小:
1
-XX: MaxDirectMemorySize(若不指定则和堆最大值一致)
- 内存溢出Dump出异常快照:
1
-XX:+HeapDumpOnOutOfMemoryError
- 设置大对象达到一定大小则直接进入老年代,可避免大对象导致在新生代中发生大量内存复制:
1
-XX:PretenureSizeThreshold 指定大小(仅对Serial和ParNew有效, 单位为字节)
- 设置进入老年代的年龄阈值:(默认为15)
1
2
3-XX:MaxTenuringThreshold
(如果新生代中的Survivor仲的相同年龄的对象大于Survivor空间的一半, 那么大于这个年龄的对象就直接进入老年代,
不受这个参数影响) - 吞吐量优先收集器: Parallel Scavenge / Parallel Old :
1
2
3-XX:MaxGCPauseMillis 最大停顿时间, 会影响新生代的内存和吞吐量, 并非越小越好
-XX:GCTimeRatio 吞吐量的大小(整数1-99)
-XX:+UseAdaptiveSizePolicy 虚拟机动态调整停顿时间或者吞吐量 - CMS(Concurrent Mark Sweep)收集器:
1
2
3
4
5更短的回收停顿时间
允许对类进行卸载
-XX:+CMSClassUnloadingEnabled
允许对方法区进行清理
-XX:+CMSPermGenSweepingEnabled - 查看本机参数默认值
1
java -XX:+PrintFlagsInitial
- 取消偏向锁 (适用于多线程的高并发应用)
1
-XX:-UseBiasedLocking
- 指定GC日志的输出路径
1
-Xloggc:路径
- 启动滚动日志
1
2
3-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=10M - 输出JVM导致应用停顿的所有时间
1
2
3-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
其他基础
- 分代收集算法:
1
2新生代 > 复制算法
老年代 > 标记-清理 / 标记-整理 - 垃圾收集器:
1
2SafePoint SafeRegion "Stop The World" 停顿时间(停掉用户线程来进行垃圾收集)
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
JDK工具
- jps: 列出虚拟机正在进行的进程 jps -lv (包含主类和参数)
- jstat: 列出虚拟机进程的统计信息
- S0C:第一个幸存区的大小
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间
- GCT:垃圾回收消耗总时间
- jstack: 打印线程