一、jinfo
jinfo可以查看设置的jvm的信息,
jinfo -flag MaxHeapSize [pid] 能够查看最大堆内存
jinfo -flag ThreadStackSize [pid]
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可以不要
2、垃圾收集
-gc、-gcutil、-gccause、-gcnew、-gcold
的出来的各个参数是什么意思呢?这里有解释:
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]
五、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也是一个很重要的命令,可以查看线程使用情况
首先我们需要知道现场的几种状态:参考
The thread is waiting indefinitely for another thread to perform a particular action. |
|
The thread is waiting for another thread to perform an action for up to a specified waiting time. |
|
状态之间是怎么转换的呢?参看
jvm里面查看线程使用情况的命令:
jstack [pid]
我们将得到的线程情况输入一个叫做stack.txt的文件:
那个文件能够查看到jvm里面某个id的线程是用来做什么的,如果发生了死锁,在最后也会列举出来。
然后在linux里面我们怎么知道线程线上执行的情况呢,哪些线程占用了很大的内存呢?用这个命令:top -p [pid] -H
这个命令能够看到单个进程里面线程的情况:
通过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)
最后这是成果: