jvm常用的命令行工具

时间:2024-03-19 17:04:49

一、jinfo

jinfo可以查看设置的jvm的信息,

jinfo -flag MaxHeapSize [pid]  能够查看最大堆内存

jinfo -flag ThreadStackSize [pid] 

jvm常用的命令行工具

jinfo -flags [pid]

jinfo -flag UseConcMarkSweepGC [pid]

jinfo -flag UseG1GC [pid]

jinfo -flag UseParallelGC [pid]

 

二、查看jvm运行时的参数

1、java -XX:+PrintFlagsFinal -version

得出的结果,如果=表示默认值,:=表示被用户或者jvm修改后的值

2、-XX:+UnlockDiagnosticVMOptions解锁诊断参数

-XX:+PrintCommandLineFlags打印命令行参数

 

三、jps

jps这个没什么好说的,在linux里面ps是查看进程,jps就是java的ps,查看java进程

如果jps -l就能查看整个类名

另外这里有个网站,可以查看到很多的指令和用法https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.html

在里面搜索jps,点进去就能看到具体的用法.

 

四、jstat

这个指令用来查看jvm统计信息,主要分以下三类:

1、类装载

jstat -class [pid] 1000 10

这个指令指的是每1秒(1000就是1000ms)查看一次类的装载信息,一共看十次。后面的1000和10可以不要

jvm常用的命令行工具

2、垃圾收集

-gc、-gcutil、-gccause、-gcnew、-gcold

jvm常用的命令行工具

的出来的各个参数是什么意思呢?这里有解释:

S0C: Current survivor space 0 capacity (kB).

S1C: Current survivor space 1 capacity (kB).

S0U: Survivor space 0 utilization (kB).

S1U: Survivor space 1 utilization (kB).

EC: Current eden space capacity (kB).

EU: Eden space utilization (kB).

OC: Current old space capacity (kB).

OU: Old space utilization (kB).

MC: Metaspace capacity (kB).

MU: Metacspace utilization (kB).

CCSC: Compressed class space capacity (kB).

CCSU: Compressed class space used (kB).

YGC: Number of young generation garbage collection events.

YGCT: Young generation garbage collection time.

FGC: Number of full GC events.

FGCT: Full garbage collection time.

GCT: Total garbage collection time.

翻译一下:

S0C、S1C、S0U、S1U:s0和s1的总量与使用量

EC、EU:Eden区总量与使用量

OC、OU:Old区总量与使用量

MC、MU:Metaspace区总量与使用量

CCSC、CCSU:压缩类空间总量与使用量

YGC、YGCT:YoungGC的次数和时间

FGC、FGCT:FullGC的次数和时间

GCT:总GC的时间

3、JIT编译

jstat -compiler [pid]

jstat -printcompilation [pid]

jvm常用的命令行工具

 

五、jmap

jmap是一个很重要的命令,可以查看jvm内存使用情况。我们分为两点讲解:

1、导出内存映像文件

内存溢出自动导出,设置参数既可:

+XX:HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=./

不用多说,设置内存溢出自动导出还有导出的路径

 

使用jmap命令手动导出:

jmap -dump:format=b,file=heap.hprof [pid]

其中format=b代表用二进制导出

 

2、查看内存映像文件:

在这里http://www.eclipse.org/mat/downloads.php下载内存分析工具,然后把dump文件导入分析就可以了:

 

六 、jstack

jstack也是一个很重要的命令,可以查看线程使用情况

首先我们需要知道现场的几种状态:参考

NEW

The thread has not yet started.

RUNNABLE

The thread is executing in the JVM.

BLOCKED

The thread is blocked waiting for a monitor lock.

WAITING

The thread is waiting indefinitely for another thread to perform a particular action.

TIMED_WAITING

The thread is waiting for another thread to perform an action for up to a specified waiting time.

TERMINATED

The thread has exited.

状态之间是怎么转换的呢?参看

jvm常用的命令行工具

 

jvm里面查看线程使用情况的命令:

jstack [pid]

我们将得到的线程情况输入一个叫做stack.txt的文件:

jvm常用的命令行工具

那个文件能够查看到jvm里面某个id的线程是用来做什么的,如果发生了死锁,在最后也会列举出来。

 

然后在linux里面我们怎么知道线程线上执行的情况呢,哪些线程占用了很大的内存呢?用这个命令:top -p [pid] -H

这个命令能够看到单个进程里面线程的情况:

jvm常用的命令行工具

通过printf  "%x" [pid]  可以将10精致的pid 转换为16进制,转换成16进制有什么用?因为jstack出来的线程是十六进制的,通过刚刚那个值,就能够在jstack出来的文件里面找到使用内存最多的线程是哪一个线程了。

 

 

七、jvisualvm

jvisualvm是一个可视化工具,集成了上面指令的几乎所有功能,但是它更加直观,所以jvisualvm也很重要。它也在jdk目录的bin目录下。

监控本地应用很简单,我们直接打开jvisualvm就能看到有本地的了。监控远程的本来也不难,但是会有一点坑,现在我们着重介绍监控远程的。

1、监控远程tomcat

修改tomcat的Catalina.sh

JAVA_OPTS=’-Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.54'   

这里参数一个个解释,第一个是端口,不用说,第二个是不需要ssl验证,链接的时候不勾那个属性,第三个是不需要验证,第四个是我们这个tomcat应用的地址,注意不是jvisualvm的地址。

2、监控远程java应用:

nohup java 

-Dcom.sun.management.jmxremote

-Djava.rmi.server.hostname=192.168.1.54  

-Dcom.sun.management.jmxremote.port=12344

-Dcom.sun.management.jmxremote.ssl=false -

Dcom.sun.management.jmxremote.authenticate=false

-Djava.net.preferIPv4Stack=true

-jar test.jar

命令是一样的,但是我们一定要记住的是54一定是我们的java的应用地址,而不是jvisual的地址。

记得开放端口。

然后把需要的添加的机器192.168.1.54添加到jvisualvm的“远程“标签里面,然后在“远程“标签里面添加端口在ip后面就可以

 

这里为什么说我们需要有坑呢。我们试一下要首先确保在java应用的机器里面可以使用jvisualvm才可以,也就是在java应用的机器里面调用jvisualvm没有报错(可能只是warning),才可以。我估计是jdk版本的问题。有可能确认了多少遍端口和应用的问题,但是就是连不上,所以就要看看是不是jdk版本的问题(也许不是,所以就在需要监控的java应用程序的机器上先试下jvisualvm)

最后这是成果:

jvm常用的命令行工具