本文已参与「新人创作礼」活动,一起开启掘金创作之路。
jps
查看系统中正在运行的JAVA进程
-v : 显示JAVA进程详细信息
jinfo [-pid]
查看JVM配置参数,动态修改部分JVM参数
-flags :打印当前指定java进程中已经设定的所有JVM参数信息
查看可动态修改的参数:java -XX:+PrintFlagsFinal -version | grep manageable
重点说明两个常用参数:
1. HeapDumpOnOutOfMemoryError :当JVM发生OOM时,自动生成dump文件
2. HeapDumpPath : 生成dump文件的路径 | 文件名称
线上环境发生OOM异常,如未设置这两个参数,要排查问题,就需要jmp来导出dump文件,可能会导致系统STW,
此时可以动态修改上面两个参数,当下次遇到OOM时,自动导出dump文件
开启参数:
布尔类型: jinfo -flag + -参数 pid
非布尔类型: jinfo -flag 参数名=参数值 pid
一般会在启动JAVA进程的时候,设置JVM参数在遇到OOM时自动导出dump
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
jmap (谨慎使用,会导致STW)
查询JAVA进程内存使用情况、生成dump文件
常用命令:
jmap -heap [pid] : 查看堆内存使用情况
jmap -dump:live,format=b,file=文件名 [pid] :导出dump文件
面试中千万不要说在生产环境中使用jmap导出dump,自己品
还有一些jstat、jstack等命令,不在此描述了,推荐大家使用 arthas进行调优或监控JVM
jvisualvm.exe(工具)
JDK自带的监控JVM工具,可以分析dump文件等等
Eclipse Memory Analyzer(工具)
堆内存分析工具,是JDK自带的堆分析工具jhat的一个非常好的替代品,能够快速地定位Java内存泄露等原因。
GCeasy (JVM日志分析工具)
该网站可以分析GC日志,以供快速分析出问题,当然还会给出优化建议等等(这个功能是收费的)
JVM开启GC日志
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/home/xian/gc/gc-recognition.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
- -XX:PrintGCDetails:输出GC日志
- -XX:PrintGCDateStamps:输出时间戳
- -Xloggc:指定GC日志路径
- -XX:+UseGCLogFileRotation:开启日志滚动
- -XX:NumberOfGCLogFiles:指定日志文件数量
- -XX:GCLogFileSize:设置日志文件大小
此处不是重点,就讲这么多吧
Arthas(JVM诊断工具)
推荐使用此工具,快速定位占用CPU高的线程、查看是否有死锁、动态监控方法入参出参、反编译,动态修改代码,实时更新等等,我粘用官方的一段话来介绍一下吧。
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
Arthas(阿尔萨斯)能为你做什么?
Arthas 是 Alibaba 开源的 Java 诊断工具,深受开发者喜爱。
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
- 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
- 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
- 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
- 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
- 是否有一个全局视角来查看系统的运行状况?
- 有什么办法可以监控到 JVM 的实时运行状态?
- 怎么快速定位应用的热点,生成火焰图?
- 怎样直接从 JVM 内查找某个类的实例?