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时间、次数等。

JVM优化(七)【命令的使用】

JVM优化(七)【命令的使用】

jstat:[jstat -gcutil] 跟-gc差不多,但是输出的是已使用空间与总内存空间的百分比

JVM优化(七)【命令的使用】

jstat:[jstat -gcnew] 输出年轻代的GC情况

JVM优化(七)【命令的使用】

jstat:[jstat -gcold] 输出年老代的GC情况

JVM优化(七)【命令的使用】

jmap:[jmp -dump] 生成堆转储快照文件

注:如果-dump没有响应时可以使用-F 强制生成快照文件,这个我们后续会进行详细介绍

JVM优化(七)【命令的使用】

jmap:[jmap -heap] 输出堆分代情况、回收器、参数等配置

JVM优化(七)【命令的使用】

jstack:[jstack -l] 输出堆栈、还有死锁之类的信息。

这个我们可以来个案例来使用下,这个后面的文章也会描述。

  • 我们使用htop命令查找到当前占用CPU、内存最高的程序。

JVM优化(七)【命令的使用】

  • 然后我开启了程序的压测入口,增加了业务处理,开启了1000个线程,每个线程处理50次下单。使用top -Hp 25919 显示如下,CPU占用率瞬间到了22.5%,我们记录下这个PID = 26000

JVM优化(七)【命令的使用】

  • 这里要说一下,JVM 栈帧中有个nid的参数,这个参数是16进制的,对应我们上图所示的pid是10进制的。我们可以先进行转换一下

JVM优化(七)【命令的使用】

  • 那么最后应该对应的nid是0x6590。我们使用jstack -l 25919输出此时运行程序的堆栈信息

JVM优化(七)【命令的使用】

  • 最后我们可以看到这个栈信息,从输出信息还可以看到这是个消息消费入口,包括代码的哪一行都展示的一览无余。记得之前我遇到线上CPU被打满的情况,我们就可以通过此信息,定位到具体的方法。

注:如果我们在输出堆栈信息时没有响应,我们可以使用jstack -F来强制输出堆栈信息。

Thread State:表示线程的状态,举例来说就是RUNNABLE,WAITING,BLOCKED等等,当在分析死锁的时候,可以查看阻塞的线程和被请求的资源。

  • 当然你也能看到一些在GC的线程使用状态,如下。

还有一个命令比较重要,通过这个命令我们可以看到内存中对象的大小及数量。

#对象解析B byteC charD doubleF floatI intJ longZ boolean[ 数组//例如[I int[]

PS:今天先介绍这些常用的命令的,当然也会用其他命令会被用到,这里就不再过多赘述,大家可以自行了解下,我们下一篇将介绍eclipse跟IDEA来监控JVM的状态。

以上是关于JVM优化命令的使用的主要内容,如果未能解决你的问题,请参考以下文章

JVM优化命令的使用

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

jvm 优化

JVM优化之jmap的使用以及内存溢出分析

tomcat优化