JAVA_HOME/bin/
目录下jdk提供了很多自带工具,下面以tomcat下的web项目为例。如果感觉输出内容太多可以使用xxx | head -n 20
显示输出内容的头20行。
jps
jps:显示当前用户的所有java进程的PID
jps -help
usage: jps [-help]jps [-q] [-mlvV] [<hostid>]Definitions:<hostid>:<hostname>[:<port>]
-m
输出传递给main 方法的参数,在嵌入式jvm上可能是null,tomcat下的web项目为例
14002 Jps -m21206 Bootstrap start
-l
输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名
21206 org.apache.catalina.startup.Bootstrap14062 sun.tools.jps.Jps
-v
输出传递给JVM的参数,要显示其他用户的还是只能用unix/linux的ps
命令。
jps
仅查找当前用户的Java进程,而不是当前系统中的所有进程。
jstat
jstat
(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。他可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。包括了对Heap size和使用请看,垃圾回收状况的监控。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]jstat -gc 21206 250 20 //查询进程pid 21206的垃圾收集情况,每250毫秒查询一次,一共查询20次。jstat -gccause pid //额外输出上次GC原因jstat -calss pid //类装载、类卸载、总空间以及所消耗的时间jstat –gcnew pid //监视新生代GC的状况jstat –gcold pid //监视老年代GC的状况
-gc
中的参数
S0C 年轻代中第一个survivor(幸存区)的容量 (字节) S1C 年轻代中第二个survivor(幸存区)的容量 (字节) S0U 年轻代中第一个survivor(幸存区)目前已使用空间 (字节) S1U 年轻代中第二个survivor(幸存区)目前已使用空间 (字节) EC 年轻代中Eden(伊甸园)的容量 (字节) EU 年轻代中Eden(伊甸园)目前已使用空间 (字节) OC Old代的容量 (字节) OU Old代目前已使用空间 (字节) PC Perm(持久代)的容量 (字节) PU Perm(持久代)目前已使用空间 (字节) YGC 从应用程序启动到采样时年轻代中gc次数 YGCT 从应用程序启动到采样时年轻代中gc所用时间(s) FGC 从应用程序启动到采样时old代(全gc)gc次数 FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s) GCT 从应用程序启动到采样时gc用的总时间(s)
jmap
生成堆转储快照(heap dump)
打印指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
堆Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足(OOM)、GC异常等情况下,我们就会怀疑有内存泄露。这个时候我们就可以制作堆Dump来查看具体情况,分析原因。
常用指令
jmap -heap pid //查看java 堆(heap)使用情况和堆内存的初始化值(易读,清晰)jmap -histo pid //查看堆内存(histogram)中的对象数量及大小 (实用)jmap -histo:live pid //JVM会先触发gc,然后再统计信息 (gc后对象一下少了一半)jmap -dump:format=b,file=heapDump pid //将内存使用的详细情况输出到文件,之后一般使用其他工具进行分析。
jstack
生成当前时刻的线程快照。
生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
jstack
命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
常用指令
jstack pid //查看线程情况jstack -F pid //正常输出不被响应时,使用该指令jstack -l pid //除堆栈外,显示关于锁的附件信息
wait on monitor entry: 被阻塞的,肯定有问题
runnable : 注意IO线程
in Object.wait(): 注意非线程池等待
jhat
jhat:(Java Heap Analysis Tool)是一个用来分析java的堆情况的命令。使用jmap
可以生成Java堆的Dump文件。生成dump文件之后就可以用jhat
命令,将dump文件转成html的形式,然后通过http访问可以查看堆情况。
jinfo
jinfo
可以输出java进程、core文件或远程debug服务器的配置信息。
常见问题
频繁GC问题或内存溢出问题
一、使用jps
查看线程ID
二、使用jstat -gc 3331 250 20
查看gc情况,一般比较关注PERM区的情况,查看GC的增长情况。
三、使用jstat -gccause
额外输出上次GC原因
四、使用jmap -dump:format=b,file=heapDump 3331
生成堆转储文件
五、使用jhat或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。
六、结合代码解决内存溢出或泄露问题。
死锁问题
一、使用jps
查看线程ID
二、使用jstack pid
查看线程情况
摘自:/archives/1561
OutOfMemery如何处理
首先线上应用的jvm配置要养成良好的习惯,增加一下配置则可以在jvm发生 oom的时候自动dump日志了 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/log/dump/jvm-oom.log
总结
1.如果程序内存不足或者频繁GC,很有可能存在内存泄露情况,这时候就要借助Java堆Dump查看对象的情况。
2.要制作堆Dump可以直接使用jvm自带的jmap命令
3.可以先使用jmap -heap
命令查看堆的使用情况,看一下各个堆空间的占用情况。
参考资料
Java命令学习系列(四)——jstat (系列文章很好,很全)