HotSpot 虚拟机常用配置

配置 说明
-Xms1g 最小堆内存
-Xmx4g 最大堆内存
-XX:+UseG1GC 使用G1垃圾回收器
-Xss256k 每个线程栈大小256k
-XX:MetaspaceSize=256m 元数据区大小256M
-XX:MaxMetaspaceSize=256m 元数据区最大256M
-XX:MaxGCPauseMillis=500 GC最大停顿毫秒数
-XX:+DisableExplicitGC 禁用代码中显式调用GC,System.gc()将会失效
-XX:+UnlockExperimentalVMOptions 解锁实验参数
-XX:+UseStringDeduplication GC的同时做重复字符串消除,只用于G1
-XX:InitiatingHeapOccupancyPercent=60 启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示”一直执行GC循环”. 默认值为 45.
-XX:ParallelGCThreads=8 设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同.
-XX:G1MixedGCCountTarget=4 设置在标记周期完成之后混合收集的数量,以维持old region(也就是老年代)中,最多有G1MixedGCLiveThresholdPercent的存活对象。默认值为8,混合收集的数量将维持在这个值之内。(JVM build > 23)
-XX:MaxTenuringThreshold=7 年老代的最大临界值(tenuring threshold). 默认值为 15.
-XX:+UseGCLogFileRotation 滚动记录GC日志文件
-XX:NumberOfGCLogFiles=5 GC日志文件数量为5个
-XX:GCLogFileSize=64M 单个GC日志文件大小64M
-Xloggc:/app/data/logs/gc-date +%Y%m%d-%H-%M.log GC日志文件存储目录和名称
-XX:+PrintGCDetails 打印GC详情
-XX:+PrintGCDateStamps 打印GC时时间戳
-XX:+PrintHeapAtGC GC时打印堆信息
-XX:+PrintAdaptiveSizePolicy 自适应大小策略,每次 GC 后会重新计算 Eden、From 和 To 区的大小,计算依据是 GC 过程中统计的 GC 时间、吞吐量、内存占用量。
-XX:+UseFastAccessorMethods
-XX:SoftRefLRUPolicyMSPerMB=0 softly reachable objects will remain alive for some amount of time after the last time they were referenced. The default value is one second of lifetime per free megabyte in the heap

命令行工具

jps

列出正在运行的虚拟机进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟唯一ID(与操作系统进程ID一致)。

jps [option] [hostid]

选项 作用
-q 只输出lvmid,省略主类的名称
-m 输出虚拟机启动时传递给主类main()的参数
-l 输出主类的全名,如果是jar包,则输出jar路径
-v 输出虚拟机启动时的jvm参数

jstat

用于监视虚拟机各种运行状态信息的命令行工具。
显示本地或者远程虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

jstat [option vimid [interval[s|ms] [count]]]
[protocal:][//]lvmid[@hostname[:port]/servername]

选项 作用
-class 监视类加载、卸载数量、总空间以及类装载耗费的时间
-gc 监视Java堆状况,包括Eden、Survivor、老年代、永久代的容量,已用空间,垃圾收集时间
-gccapacity 监视内容与-gc基本相同,但输出主要关注java堆各个区域使用到最大最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause 与-gcutil功能一样,会额外输出导致上一次垃圾收集产生的原因
-gcnew 监视新生代垃圾收集情况
-gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold 监视老年代垃圾收集状况
-gcoldcapacity 与-gcold相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity 输出永久代使用到的最大、最小空间
-compiler 输出即时编译器编译过的方法、耗时等信息
-printcompilation 输出已经被即时编译的方法

每隔1s查询一次2105的gc情况,查询10次。
jstat -gc 2105 1000 10

jstat -gcutil 2105

S0 S1 E O P YGC YGCT FGC FGCT GCT
0.00 0.00 6.20 41.42 47.20 16 0.105 3 0.472 0.577

jinfo

实时查看和调整虚拟机各项参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Usage:
jinfo [option] <pid>
(to connect to running process)
jinfo [option] <executable <core>
(to connect to a core file)
jinfo [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)

where <option> is one of:
-flag <name> to print the value of the named VM flag
-flag [+|-]<name> to enable or disable the named VM flag
-flag <name>=<value> to set the named VM flag to the given value
-flags to print VM flags
-sysprops to print Java system properties
<no option> to print both of the above
-h | -help to print this help message

jmap

用于生成堆转储快照,查询finalize执行队列、Java堆和方法区的详细信息(空间使用率、当前使用收集器类型)

生成堆转储文件的方式:

1
2
3
4
-XX:+HeapDumpOnOutOfMemoryError 在虚拟机内存溢出异常出现后自动生成堆转储快照文件。
-XX:HeapDumpOnCtrlBreak 使用ctrl+Break 生成堆转储快照文件
kill -3 pid 生成堆转储快照文件
jmap -dump:format=b,file=heap.dump 3120
选项 作用
-dump 生成java堆转储快照,格式为-dump:[live,]format=b,file=,live子参数说明是否只dump出存活对象
-finalizerinfo 显示再F-Queue中等待Finalizer线程执行finalize方法的对象。只有在Linux平台有效
-heap 显示Java堆详细信息,使用回收器类型、参数配置、分代状况,只在Linux平台下有效
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-permstat 在以ClassLoader为统计口径显示永久代内存状态。只在Linux下有效
-F 当虚拟机进程对-dump选项没有响应时,可以使用-F强制生成dump快照,只在Linux下有效

jhat

用于分析jmap生成的堆转储快照。

jhat heap.dump

jhat功能相对简陋,分析工作耗时且耗费硬件资源,一般不在本机使用。
替代方案:VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer。

jstack

生成虚拟机当前时刻的线程快照。目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)

Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message

高级工具

JConsole

基于JMX的可视化监视、管理工具。

JHSDB

基于服务性代理实现的进程外调试工具。服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。
JCMD 和JHSDB工具对比

VisualVM

多合一故障处理工具,不需要被监视的程序基于特殊Agent执行,通用性强,对应用程序的实际性能影响较小,可以直接在生产环境使用。

Java Mission Control

可持续在线监控工具。

arthas

阿里巴巴提供的性能分析工具
https://alibaba.github.io/arthas/