目录
1 jinfo 命令
1.1 jps、jps -l 、jps -v 、jps -m:查看当前JVM进程的PID
1.2 jinfo -flags PID。ps -ef | grep java | tr ' ' '\n' | grep '\-X' --color:查看当前JVM进程的JVM全部参数
1.3 jinfo -flag:查看某一个具体JVM参数的设置
2 jstat 命令
2.1 jstat -gc PID 1000:监视Java堆状况,包括Eden区2个Survivor区老年代等的容量
2.2 jstat -gcutil PID 1000:输出内容 -gc 相仿, 主要关注已使用空间占总空间的百分比
2.3 jstat –class : 监视类装载、卸载数量、总空间及类装载所耗费的时间
2.4 jstat -gcnew :监视新生代GC的状况
2.5 jstat -gcold :监视老年代GC的状况
2.6 jstat –compiler :输出JIT编译器编译过的方法、耗时等信息
3 jhat 与 jmap
步骤3.1:运行java程序
步骤3.2:查看该java程序的PID:jps -l
步骤3.3:生成dump文件:jmap -dump:format=b,file=heapDump.hprof 19483
步骤3.4 解析Java堆转储文件,并启动一个web server:jhat heapDump.hprof
步骤3.5 分析Java堆转储文件
(1)JVM参数列表-官方:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC
(2)JDK内置各种工具命令-官方:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html
用来查看正在运行的 Java 应用程序的扩展参数,包括 Java System 属性和 JVM 命令行参数。
-l:输出完全的包名,应用主类名,jar的完全路径名。-v:输出jvm参数。-m:输出传入 main 方法的参数。
(1)jinfo -flags PID 注:其中PID为当前java进程ID,PID可以通过jps命令或jcmd命令查看。
(2)jinfo -flags 7172 | tr " " "\n" | grep "\-XX" --color
(3)ps -ef | grep java | tr ' ' '\n' | grep '\-X' --color
jinfo -flag
jstat:JVM 自带命令行工具,可用于统计内存分配速率、GC 次数,GC 耗时。常用格式:jstat -gc
例如:jstat -gc 32683 1000 10:统计 pid=32683 的JVM进程,每1000ms秒统计 1 次,共统计 10 次。
例如:jstat -gc 32683 1000:统计 pid=32683 的JVM进程,每1000ms秒统计 1 次,一直统计下去。
Loaded:装载的类的数量。Bytes:装载类所占用的字节数。Unloaded:卸载类的数量。Bytes:卸载类的字节数。Time:装载和卸载类所花费的时间。
jmap:JVM 自带命令行工具,可用于了解系统运行时的对象分布。使用 jmap 可以生成Java堆的Dump文件,生成dump文件之后就可以用 jhat 命令,将dump文件转成html形式,然后通过http访问可以查看堆情况。jhat 命令解析会Java堆dump并启动一个web服务器,然后就可以在浏览器中查看堆的dump文件了。
// -Xms40m -Xmx40m -XX:NewSize=20M -XX:MaxNewSize=20M -XX:SurvivorRatio=2 -XX:MaxTenuringThreshold=15
public class JHatTest {
public static void main(String[] args) {
while (true) {
String string = new String("hollis");
try {
Thread.sleep(1000);
System.out.println(string);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
~ jps -l
19507 sun.tools.jps.Jps
325
19482 org.jetbrains.jps.cmdline.Launcher
19483 com.wind.ssm.java8.test.JHatTest
13900 org.jetbrains.idea.maven.server.RemoteMavenServer
注意:此步骤是生成堆内存转储快照,会在当前目录下导出 heapDump.hrpof 的二进制文件,然后可以用eclipse的 MAT / GCeasy在线分析工具 分析 heapDump.hrpof 文件 。
~ jmap -dump:format=b,file=heapDump.hprof 19483
Dumping heap to /Users/cmm/heapDump.hprof ...
Heap dump file created
使用jhat命令,就启动了一个http服务,端口是7000,然后在访问 http://localhost:7000/
~ jhat heapDump.hprof
Reading from heapDump.hprof...
Dump file created Wed Nov 18 20:05:55 CST 2020
Snapshot read, resolving...
Resolving 19812 objects...
Chasing references, expect 3 dots...
Eliminating duplicate references...
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
打开的堆转储文件页面如下:
一般查看堆异常情况主要看这个两个部分:
(1)Show instance counts for all classes (excluding platform):平台外的所有对象信息
(2)Show heap histogram:以树状图形式展示堆情况。
jps
jstat -gcutil PID 1000
jinfo -flag UseTLAB PID
ps -ef|grep java|tr ' ' '\n'|grep '\-X' --color
// 远程机器
sudo -iu sankuai
tar -czf heap_trace.txt.tar.gz heap_trace.txt
sftp [email protected]
sftp> put heap_trace.txt.tar.gz
ls -al
//本地机器
sftp [email protected]
sftp> get heap_trace.txt.tar.gz
tar -xzf dump.hprof.tar.gz
less heap_trace.txt