常用的JVM命令

目录

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

1 jinfo 命令

用来查看正在运行的 Java 应用程序的扩展参数,包括 Java System 属性和 JVM 命令行参数。

1.1 jps、jps -l 、jps -v 、jps -m:查看当前JVM进程的PID

-l:输出完全的包名,应用主类名,jar的完全路径名。-v:输出jvm参数。-m:输出传入 main 方法的参数。

1.2 jinfo -flags PID。ps -ef | grep java | tr ' ' '\n' | grep '\-X' --color:查看当前JVM进程的JVM全部参数

(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

   

1.3 jinfo -flag <option> <pid>:查看某一个具体JVM参数的设置

jinfo -flag <option> <pid>    注:其中option为具体的某一个JVM参数。

2 jstat 命令

jstat:JVM 自带命令行工具,可用于统计内存分配速率、GC 次数,GC 耗时。常用格式:jstat -gc <pid> <统计间隔时间>  <统计次数>

2.1 jstat -gc PID 1000:监视Java堆状况,包括Eden区2个Survivor区老年代等的容量 

例如:jstat -gc 32683 1000 10:统计 pid=32683 的JVM进程,每1000ms秒统计 1 次,共统计 10 次。

例如:jstat -gc 32683 1000:统计 pid=32683 的JVM进程,每1000ms秒统计 1 次,一直统计下去。

2.2 jstat -gcutil PID 1000:输出内容 -gc 相仿, 主要关注已使用空间占总空间的百分比

2.3 jstat –class <PID> : 监视类装载、卸载数量、总空间及类装载所耗费的时间

Loaded:装载的类的数量。Bytes:装载类所占用的字节数。Unloaded:卸载类的数量。Bytes:卸载类的字节数。Time:装载和卸载类所花费的时间。

2.4 jstat -gcnew <PID>:监视新生代GC的状况

2.5 jstat -gcold <PID>:监视老年代GC的状况

2.6 jstat –compiler <PID>:输出JIT编译器编译过的方法、耗时等信息

3 jhat 与 jmap

jmap:JVM 自带命令行工具,可用于了解系统运行时的对象分布。使用 jmap 可以生成Java堆的Dump文件,生成dump文件之后就可以用 jhat 命令,将dump文件转成html形式,然后通过http访问可以查看堆情况。jhat 命令解析会Java堆dump并启动一个web服务器,然后就可以在浏览器中查看堆的dump文件了。

步骤3.1:运行java程序

// -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();
            }
        }
    }
}

步骤3.2:查看该java程序的PID:jps -l

~ 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

步骤3.3:生成dump文件:jmap -dump:format=b,file=heapDump.hprof 19483

注意:此步骤是生成堆内存转储快照,会在当前目录下导出 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

步骤3.4 解析Java堆转储文件,并启动一个web server:jhat heapDump.hprof

使用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.

打开的堆转储文件页面如下:

步骤3.5 分析Java堆转储文件

一般查看堆异常情况主要看这个两个部分:

(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

猜你喜欢

转载自blog.csdn.net/cmm0401/article/details/109743561