JVM优化命令的使用
Posted 段王爷的府邸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM优化命令的使用相关的知识,希望对你有一定的参考价值。
前言
通过前一系列的文章我们对JVM的内存分配跟垃圾回收也有个一个概念了。我敢保证前几篇文章如果理解了,在此之后的阅读过程中,你会感觉非常的轻松。
JDK命令行工具
我们使用过java -version、java、javac,但是除了这些命令行工具,我们还必须牢记另外几个命令,如下。
jps 用来显示当前系统所有的HotSpot JVM进程。
jstat 用来显示HotSpot JVM运行数据。
jmp 用来生产JVM的内存转储快照。
jstack 用来显示JVM线程快照。
注:每个参数都是额外选项的可以选择,笔者只列举常用的,如有兴趣篇外了解。所输出的具体数值暂不作解释。
jps:[jsp -v ] 输出JVM启动时的运行参数(以笔者运行的应用为例)
jstat:[jstat -gc] 输出Eden、Survivor、年老代、永久代等的容量跟使用空间,GC时间、次数等。
jstat:[jstat -gcutil] 跟-gc差不多,但是输出的是已使用空间与总内存空间的百分比
jstat:[jstat -gcnew] 输出年轻代的GC情况
jstat:[jstat -gcold] 输出年老代的GC情况
jmap:[jmp -dump] 生成堆转储快照文件
注:如果-dump没有响应时可以使用-F 强制生成快照文件,这个我们后续会进行详细介绍
jmap:[jmap -heap] 输出堆分代情况、回收器、参数等配置。
jstack:[jstack -l] 输出堆栈、还有死锁之类的信息。
这个我们可以来个案例来使用下,这个后面的文章也会描述。
我们使用htop命令查找到当前占用CPU、内存最高的程序。
然后我开启了程序的压测入口,增加了业务处理,开启了1000个线程,每个线程处理50次下单。使用top -Hp 25919 显示如下,CPU占用率瞬间到了22.5%,我们记录下这个PID = 26000
这里要说一下,JVM 栈帧中有个nid的参数,这个参数是16进制的,对应我们上图所示的pid是10进制的。我们可以先进行转换一下
那么最后应该对应的nid是0x6590。我们使用jstack -l 25919输出此时运行程序的堆栈信息。
最后我们可以看到这个栈信息,从输出信息还可以看到这是个消息消费入口,包括代码的哪一行都展示的一览无余。记得之前我遇到线上CPU被打满的情况,我们就可以通过此信息,定位到具体的方法。
注:如果我们在输出堆栈信息时没有响应,我们可以使用jstack -F来强制输出堆栈信息。
Thread State:表示线程的状态,举例来说就是RUNNABLE,WAITING,BLOCKED等等,当在分析死锁的时候,可以查看阻塞的线程和被请求的资源。
当然你也能看到一些在GC的线程使用状态,如下。
还有一个命令比较重要,通过这个命令我们可以看到内存中对象的大小及数量。
#对象解析
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组
//例如
[I int[]
PS:今天先介绍这些常用的命令的,当然也会用其他命令会被用到,这里就不再过多赘述,大家可以自行了解下,我们下一篇将介绍eclipse跟IDEA来监控JVM的状态。
以上是关于JVM优化命令的使用的主要内容,如果未能解决你的问题,请参考以下文章
java 简单的代码片段,展示如何将javaagent附加到运行JVM进程