Java 调优工具---jps , jmap , jstack , jstat , jinfo , jhat .

个人备忘

JPS
java process status
说明:功能和ps 命令类似,列出正在运行的虚拟机进程,可以显示执行主类名称以及LVMID。

  1. 本地虚拟机唯一id lvmid local virtual machine id
  2. -m 运行时传入主类的参数。
  3. -v 虚拟机参数。
  4. -l 运行的主类全面 或者 jar 包名称。

Jstat
说明:监视虚拟机各种运行状态信息,可以显示本地或远程虚拟机中类装载,内存,垃圾回收,jit编译的信息等运行数据;

/* jstat 依赖我们的jps 命令,需要知道具体进程(jvm)。 */

官方文档详细说明 (谷歌浏览器自带翻译)

C:\Users\agui>jstat -options
-class // 显示有关类加载器行为的统计信息。
-compiler // 显示有关Java HotSpot VM即时编译器行为的统计信息。
-gc // 显示有关垃圾收集堆行为的统计信息。
-gccapacity // 显示有关世代及其相应空间容量的统计信息。
-gccause // 显示有关垃圾收集统计信息的摘要(-gcutil与之相同),以及最后一个和当前(如果适用)垃圾回收事件的原因。
-gcmetacapacity // 显示有关元空间大小的统计信息。
-gcnew // 显示新一代行为的统计信息。
-gcnewcapacity // 显示有关新一代及其相应空间大小的统计信息。
-gcold // 显示有关旧一代和元数据统计信息的行为的统计信息。
-gcoldcapacity // 显示有关旧一代大小的统计信息。
-gcutil // 显示关于垃圾收集统计信息的摘要。
-printcompilation // 显示Java HotSpot VM编译方法统计信息。

案例 : 一秒一打印,打印10次。
C:\Users\agui>jstat -gc 3536 1000 10
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659
0.0 28672.0 0.0 28672.0 344064.0 232448.0 471040.0 374362.4 147568.0 134726.7 19824.0 16181.0 153 2.659 0 0.000 2.659

Jinfo
说明:实时查看和调整虚拟机各项参数。

官方文档说明

通过opetions 查看命令,第一行已说明,参数后要交加上 pid 指定具体的jvm 。

C:\Users\agui>jinfo -options
Usage:
    jinfo [option] <pid>  
        (to connect to running process)
    jinfo [option] <executable <core>
        (to connect to a core file)
    jinfo [option] [server_id@]<remote server IP or hostname>
        (to connect to remote debug server)

where <option> is one of:
    -flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message

案例 :

C:\Users\agui>jinfo -flag UseSerialGC 3536
-XX:-UseSerialGC // 该jmv 没有使用该收集器
C:\Users\agui>jinfo -flag UseG1GC 3536
-XX:+UseG1GC , // 该jvm 使用了g1 收集器。

Jmap
说明:用于生成对转存快照,还可以查询finalize 执行队列。堆和永久代的详细信息;展示-dump , -heap , -histo 。

官方文档说明

注意:有些命令在win 上可能不支持。jmap 也需要配合jps 查看pid 来进行。

-dump:[live,] format = b,file = filename
将hprof二进制格式的Java堆转储到filename。该live子选项是可选的,但指定时,只有堆中的活动对象被转储。要浏览堆转储,可以使用jhat(1)命令读取生成的文件。

-finalizerinfo
打印有关正在等待最终确定的对象的信息。

-打印所使用的垃圾收集的堆摘要,头配置和生成智能堆使用情况。另外,打印字符串的数量和大小。

-histo [:生活]
打印堆的直方图。对于每个Java类,都会打印对象的数量,以字节为单位的内存大小以及完全限定的类名称。JVM内部类名称以星号(*)前缀打印。如果live指定了子选项,则只有活动对象被计数。

-clstats
打印Java堆的类加载器智能统计信息。对于每个类加载器,它的名称,它的活跃程度,地址,父类加载器以及它所加载的类的数量和大小都将被打印。

-F
力。当pid不响应时,使用jmap -dump或jmap -histo选项使用此选项。该live模式不支持子选项。

-H
打印帮助信息。

案例:

C:\Users\agui>jmap -histo 3536 |more

 num     #instances         #bytes  class name
----------------------------------------------
   1:       2705526       64932624  java.lang.String
   2:        148266       64099496  [B
   3:        639051       57955312  [C
   4:        969271       31016672  java.util.HashMap$Node
   5:        182583       26971368  [I
   6:        439534       18300208  [Ljava.lang.String;
   7:        355211       14208440  org.eclipse.jst.jee.archive.internal.ArchiveResourceImpl
   8:         98700       13715352  [Ljava.util.HashMap$Node;
   9:        153604       10112360  [Ljava.lang.Object;
  10:        386453        9274872  org.eclipse.core.runtime.Path

Jhat
说明: jhat是java虚拟机自带的一种虚拟机堆转储快照分析工具。

官方文档说明

-stack false | true
关闭跟踪对象分配调用堆栈。如果分配站点信息在堆转储中不可用,则必须将此标志设置为false。默认是true。

-refs false | true
关闭跟踪对象的引用。默认是true。默认情况下,会针对堆中的所有对象计算指向指向对象的对象(例如引用者或传入引用)的后指针。

-port 端口号
设置jhatHTTP服务器的端口。默认值是7000。

- 排除排除文件
指定一个文件,列出应该从可达对象查询中排除的数据成员。例如,如果文件列出java.lang.String.value,那么只要o计算可从特定对象到达的对象列表,java.lang.String.value就不考虑涉及字段的引用路径。

- 基准排除文件
指定基线堆转储。两个具有相同对象ID的堆转储中的对象都被标记为不是新的。其他对象被标记为新的。这对于比较两个不同的堆转储很有用。

-debug int
设置此工具的调试级别。0级表示没有调试输出。为更详细的模式设置更高的值。

-报告版本号并退出

-H
显示帮助信息并退出。

-帮帮我
显示帮助信息并退出。

-J 标志
传递flag到jhat运行命令的Java虚拟机。例如,-J-Xmx512m要使用512 MB的最大堆大小。

案例:

C:\Users\agui>jhat e:\a.bin
Reading from e:\a.bin...
Dump file created Mon Mar 05 15:18:32 CST 2018
Snapshot read, resolving...
Resolving 8625075 objects...
Chasing references, expect 1725 dots.....................................................................................................................................................................
Eliminating duplicate references.............................................................................................................................................................................................
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.

如上我们用jhat 分析了我们jmap 生成的dump ,一般来讲,我们已经拿到了dump 文件,我们更多的是利用图像化工具,很少使用jhat , 但是 jhat 也是很强大的,每次分析完,它都会开启一个http server 服务。我们可以访问下: localhost:7000 , 在这里你可以查看hisgrom , 也可以打开OQL 页面查看莫个类大小数量等信息 。

Jstack
说明:用于生成虚拟机当前时刻的线程快照,包含虚拟机中每一个线程正在执行的方法堆栈的集合,用于定位线程出现长时间停顿的原因,如死锁,死循环,外部资源长时间等待等。

官方文档说明

-F
jstack[ -l] pid不响应时强制进行堆栈转储。

-l
长期上市。打印有关锁的其他信息,例如拥有的可拥有java.util.concurrent同步器列表。请参阅AbstractOwnableSynchronizer课程说明
http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/AbstractOwnableSynchronizer.html

-m
打印具有Java和本机C / C ++框架的混合模式堆栈跟踪。

-H
打印帮助信息。

案例:

C:\Users\agui\Desktop>jstack -l  3536
2018-03-05 15:47:36
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.131-b11 mixed mode):

"Worker-161" #210 prio=5 os_prio=0 tid=0x0000000029141800 nid=0x1f5c in Object.wait() [0x000000004662f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
        - locked <0x00000000c25c6348> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)

   Locked ownable synchronizers:
        - None

"Worker-159" #208 prio=5 os_prio=0 tid=0x000000002914b800 nid=0x2b34 in Object.wait() [0x000000004632f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:188)
        - locked <0x00000000c25c6348> (a org.eclipse.core.internal.jobs.WorkerPool)
        at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:220)
        at org.eclipse.core.internal.jobs.Worker.run(Worker.java:52)

   Locked ownable synchronizers:
        - None

最后 :

jconsole , jvisualvm 这两个命令是图形化界面工具,工具的使用大家自行找资料使用吧,多说一句:jvisualvm 有扩展插件,也可以打印 堆和线程的dump 快照。并且可以代替上面提到的jhat 进行dump 的分析等。

猜你喜欢

转载自blog.csdn.net/qq_16681279/article/details/79447087