jdk自带java分析工具_JVM系列-04-JDK自带的管理分析工具

[TOC]

声明

本篇文章是本人阅读《深入理解JVM》和《java虚拟机规范》时的笔记。

记录的都是一些概念性的东西。

JVM是HotSpot,jdk1.7。

大神绕路,不喜勿喷。

1 概览

对于java程序员来说,java、javac、javadoc…… ,这些命令都能熟练地使用。

除了这些命令,在$JAVA_HOME/bin目录下还有一些非常常用的命令。

在本人机器上,该目录下的内容如下:

$ pwd

/c/Program Files/Java/jdk1.8.0_101/bin

$ ls

appletviewer.exe* javadoc.exe* jcmd.exe* jmap.exe* jstatd.exe* orbd.exe* servertool.exe*

extcheck.exe* javafxpackager.exe* jconsole.exe* jmc.exe* jvisualvm.exe* pack200.exe* sigar-amd64-winnt.dll*

idlj.exe* javah.exe* jdb.exe* jmc.ini keytool.exe* policytool.exe* sigar-x86-winnt.dll*

jabswitch.exe* javap.exe* jdeps.exe* jps.exe* kinit.exe* rmic.exe* tnameserv.exe*

jar.exe* javapackager.exe* jhat.exe* jrunscript.exe* klist.exe* rmid.exe* unpack200.exe*

jarsigner.exe* java-rmi.exe* jinfo.exe* jsadebugd.exe* ktab.exe* rmiregistry.exe* wsgen.exe*

java.exe* javaw.exe* jjs.exe* jstack.exe* msvcr100.dll* schemagen.exe* wsimport.exe*

javac.exe* javaws.exe* jli.dll* jstat.exe* native2ascii.exe* serialver.exe* xjc.exe*

2 命令行工具

2.1 jps

喜欢linux的用户一定用过一个命令就是ps,为 Process Snapshot的缩写,也就是进程快照。

此处的jps也就是 "Java Process Snapshot"(java进程快照)的缩写了。

语法:

C:\Users\hylexus>jps -help

usage: jps [-help]

jps [-q] [-mlvV] []

Definitions:

: [:]

选项:

q : 只显示LVMID(Local Virtual Machine Identifier)而忽略主类名

m : 进程启动时传递给入口函数(main)的参数

l : 输出全类名或者jar包路径

v : 进程启动时传递的JVM参数

2.2 jstat

语法

C:\Users\hylexus>jstat -help

Usage: jstat -help|-options

jstat - [-t] [-h] [ []]

Definitions:

要查询的属性或VM特性

-class 监视类装载、卸载数量、总空间以及类装载耗费的时间

-gc 监视Java的堆。比如Eden、survivor等

-gccapacity 和gc类似,但是主要关注点是堆中各个区域的容量

-gcutil 和gc类似,但是主要关注点是各个区域已使用部分占总容量的百分比

-gccause 和gcutil类似,但是会同时输出导致上一次GC的原因

-gcnew 监视新生代GC状况

-gcnewcapacity ………………(容量)

-gcold ………………(老年代)

-gcoldcapacity ………………(容量)

-compiler JIT编译器编译过的方法、耗时等信息

-printcompilation 被JIT编译器编译过的方法

VMID/LVMID:

在本地环境VMID和LVMID是一致的

远程环境中VMID应该是:

[@[:]]

Number of samples between header lines.

刷新时间间隔:

["ms"|"s"],默认单位为毫秒。

总共查询多少次.

-J Pass directly to the runtime system.

示例:

jstat -gcutil 67008 5s 3

查看pid为67008的进程的堆内存各个区域占用总容量百分比,

5秒刷新一次,共查询3次

运行结果如下:

C:\Users\hylexus>jstat -gcutil 67008 5s 3

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT

0.00 83.42 0.38 48.24 89.79 78.31 31 0.578 5 1.067 1.645

0.00 83.42 0.38 48.24 89.79 78.31 31 0.578 5 1.067 1.645

0.00 83.42 0.38 48.24 89.79 78.31 31 0.578 5 1.067 1.645

说明:

S0: Survivor0(新生代Survivor)是空的

S1: Survivor1(新生代Survivor)是空的

E: Eden(新生代Eden)占用0.38%

O: Old(老年代)占用48.24%

M:

CCS:

YGC: Young GC==> Minor GC ==> 新生代GC的次数

YGCT: YGC 耗时0.578秒

FGC: Full GC==>老年代GC的次数

FGCT: FGC总耗时1.067秒

GCT: 所有GC总耗时1.645秒

2.3 jinfo

jinfo可以查看和调整虚拟机各项参数。

语法

C:\Users\hylexus>jinfo -help

Usage:

jinfo [option]

(to connect to running process)

jinfo [option]

(to connect to a core file)

jinfo [option] [server_id@]

(to connect to remote debug server)

where is one of:

-flag 打印指定参数值

-flag [+|-] 启用(+)或禁用(-)指定参数

-flag = 设置指定参数的值

-flags 打印JVM参数

-sysprops 相当于System.getProperites()

表示不带任何选项,将打印出以上所提到的所有属性

示例

打印出pid为67008的进程的JVM参数

C:\Users\hylexus>jinfo -flags 67008

Attaching to process ID 67008, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.101-b13

Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=41943040 -XX:MaxHeapSize=1258291200 -XX:MaxNewSize=419430400 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=13631488 -XX:OldSize=28311552 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC

Command line: -Dosgi.requiredJavaVersion=1.8 -Xms40m -Xverify:none -Dorg.eclipse.swt.browser.IEVersion=10001 -Xmx1200m

查询pid为67008的进程的初始堆大小

C:\Users\hylexus>jinfo -flag InitialHeapSize 67008

-XX:InitialHeapSize=41943040

2.4 jmap

jmap(Memory map)可以生成堆转储快照(一般称为heapdump或dump文件)

语法

C:\Users\hylexus>jmap -help

Usage:

jmap [option]

(to connect to running process)

jmap [option]

(to connect to a core file)

jmap [option] [server_id@]

(to connect to remote debug server)

where is one of:

不带选项,打印出和Solaris下的pmap一样的信息

-heap 打印出堆的详细情况

如垃圾收集器组合、分带情况等

只在Linux下有效

-histo[:live] 堆中对象信息统计。如类实例数量等。

live,只统计活着的对象信息

-clstats 类加载器信息

-finalizerinfo 打印出在F-Queue队列中等待执行finalizer()方法的对象信息

-dump: 堆转储快照

dump-options:

live 只是dump出存活着的对象

format=b binary format

file= 可选,dump到哪个文件中

示例: jmap -dump:live,format=b,file=heap.bin

-F 当JVM对-dump选项没有响应时可以是使用-F来强制dump

只在Linux/Solaris下有效

示例

jmap -heap 67008

jmap -finalizerinfo 67008

jmap -dump:live,format=b,file=t.bin 67008

2.5 jhat

jhat(JVM Heap Analysis Tool)是虚拟机堆转储快照分析工具。一般是用来分析用jmap生成的堆快照信息。

但是他的分析结果不太美观,不是非常容易读懂。

他会启动一个内置的http服务器来将分析结果展现为html格式。

示例

生成快照

C:\Users\hylexus>jmap -dump:live,format=b,file=t.bin 67008

Dumping heap to C:\Users\hylexus\t.bin ...

Heap dump file created

C:\Users\hylexus>

# 分析快照

C:\Users\hylexus>jhat t.bin

Reading from t.bin...

Dump file created Mon Dec 19 22:43:48 CST 2016

Snapshot read, resolving...

Resolving 1861041 objects...

Chasing references, expect 372 dots....................................................................................................................................................................................................................................................................................................................................................................................

Eliminating duplicate references....................................................................................................................................................................................................................................................................................................................................................................................

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

此时在浏览器里访问 127.0.0.1:7000就能看到分析结果:

jdk自带java分析工具_JVM系列-04-JDK自带的管理分析工具_第1张图片

2.6 jstack

jstack(Stack Trace for Java)可以生成虚拟机当前时刻的线程快照。

一般称为threaddump或者javacore文件。即每一条线程正在执行的方法堆栈的集合。

语法

C:\Users\hylexus>jstack -help

Usage:

jstack [-l]

(to connect to running process)

jstack -F [-m] [-l]

(to connect to a hung process)

jstack [-m] [-l]

(to connect to a core file)

jstack [-m] [-l] [server_id@]

(to connect to a remote debug server)

Options:

-F 当JVM不响应该请求时强制进行线程dump

-m 显示java方法也可以是本地方法的堆栈信息

-l 显示有关锁的附加信息

3 图形化工具

对于这两个可视化工具的使用就不在多说什么了。

点鼠标谁都会。

3.1 jconsole

jdk自带java分析工具_JVM系列-04-JDK自带的管理分析工具_第2张图片

3.2 jvisualvm

jdk自带java分析工具_JVM系列-04-JDK自带的管理分析工具_第3张图片

参考文章

《深入理解JVM》

《Java虚拟机规范》-JDK1.7

你可能感兴趣的:(jdk自带java分析工具)