Jmap命令用于生成堆转储快照,有时候也成为heapdump或者dump文件。
Jmap不仅仅可以获取dump文件,还可以查询finalize执行队列,Java堆和永久代的详细信息,如空间使用率、当时用的是那种收集器等。
命令格式:
C:Program Files (x86)Javajdk1.7.0_79in>jmap
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
where <option> is one of:
<none> to print same info as Solaris pmap
-heap 打印java堆统计消息
-histo[:live] 显示堆中对象的统计信息
-permstat 打印永久内存统计信息
-finalizerinfo 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
-dump:<dump-options>
dump-options:
live live导出存活对象 不指定导出所有对象
format=b 二进制格式
file=<file> 指定dump文件目录
例如: jmap -dump:live,format=b,file=heap.bin <pid>
-F 使用 -dump:<dump-options> <pid> or -histo
当-dump没有响应时,强制生成dump快照. "live"不支持
option介绍模拟环境 随便开启java类 System.in.read()造成阻塞
-heap 统计堆内存情况
C:Program Files (x86)Javajdk1.7.0_79in>jmap -heap 69616
Attaching to process ID 69616, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 24.79-b02
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
MinHeapFreeRatio = 40 //对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 70 //对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 536870912 (512.0MB) //对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 1048576 (1.0MB) //对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 4294901760 (4095.9375MB) //对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 4194304 (4.0MB) //对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 //对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 //对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
PermSize = 134217728 (128.0MB) //对应jvm启动参数-XX:PermSize=<value>:设置JVM堆的‘永生代’的初始大小
MaxPermSize = 134217728 (128.0MB) //对应jvm启动参数-XX:MaxPermSize=<value>:设置JVM堆的‘永生代’的最大大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: 堆使用情况
New Generation (Eden + 1 Survivor Space): 新生代情况 (edn+1个survivor区)
capacity = 161021952 (153.5625MB) 总容量
used = 8587904 (8.1900634765625MB) 使用
free = 152434048 (145.3724365234375MB) 剩余
5.333374669312169% use d 使用比例
Eden Space: edn区统计
capacity = 143130624 (136.5MB)
used = 8587904 (8.1900634765625MB)
free = 134542720 (128.3099365234375MB)
6.000046502976191% used
From Space: survivor1 区统计
capacity = 17891328 (17.0625MB)
used = 0 (0.0MB)
free = 17891328 (17.0625MB)
0.0% used
To Space: survivor2区统计
capacity = 17891328 (17.0625MB)
used = 0 (0.0MB)
free = 17891328 (17.0625MB)
0.0% used
tenured generation: 老年代统计
capacity = 357957632 (341.375MB)
used = 0 (0.0MB)
free = 357957632 (341.375MB)
0.0% used
Perm Generation: 永久代统计
capacity = 134217728 (128.0MB)
used = 284864 (0.27166748046875MB)
free = 133932864 (127.72833251953125MB)
0.21224021911621094% used
11833 interned Strings occupying 916536 bytes.
-heap 统计堆内存情况打印堆的对象统计,包括对象数、内存大小等等 (因为在dump:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小 )
C:Program Files (x86)Javajdk1.7.0_79in>jmap -histo:live 69616
num #instances #bytes class name
----------------------------------------------
1: 1379 247800 [C
2: 801 84824 <constMethodKlass>
3: 801 57728 <methodKlass>
4: 100 45968 <constantPoolKlass>
5: 109 37008 [B
6: 100 36384 <instanceKlassKlass>
7: 1231 29544 java.lang.String
8: 785 25120 java.util.TreeMap$Entry
9: 92 21712 <constantPoolCacheKlass>
10: 316 12824 [Ljava.lang.Object;
11: 40 12480 <objArrayKlassKlass>
12: 140 11968 java.lang.Class
13: 138 8832 java.lang.reflect.Field
14: 179 7624 [S
15: 189 7080 [Ljava.lang.String;
16: 165 6112 [[I
17: 97 3104 java.lang.ref.SoftReference
18: 112 2688 java.util.Hashtable$Entry
后面classname分别表示B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
-permstat打印Java堆内存的永久保存区域的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
C:Program Files (x86)Javajdk1.7.0_79in>jmap -permstat 69616
Attaching to process ID 69616, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 24.79-b02
finding class loader instances ..done.
computing per loader stat ..done.
please wait.. computing liveness..............done.
class_loader classes bytes parent_loader alive? type
<bootstrap> 426 1817688 null live <internal> Bootstrap类加载器
0x1aef9408 0 0 null live sun/misc/Launcher$ExtCla Ext类加载器
ssLoader@0x38e95570
0x1aefb8a8 14 107320 0x1aef9408 live sun/misc/Launcher$AppCla 应用类加载器
ssLoader@0x38eb7728
total = 3 440 1925008 N/A alive=3, dead=0 N/A
-dump 导出堆信息到dump文件中 该文件直接用MAT(Memory Anlysis Tool)打开。C:Program Files (x86)Javajdk1.7.0_79in>jmap -dump:live,format=b,file=dump.h
prof 69616
Dumping heap to C:Program Files (x86)Javajdk1.7.0_79indump.hprof ...
Heap dump file created
安装mat 在eclipse markerplace搜索mat 安装具体用法参考 动态图
下面是overview选项图
1. Histogram可以列出内存中的对象,对象的个数以及大小。
Shallow Size表示该类型实际占用堆的大小 Retained Size:表示gc后被回收的大小
3.Top consumers通过图形列出最大的object。
4.Leak Suspects通过MA自动分析泄漏的原因。
2.jhat
jhat(JVM Heap Analysis Tool) 命令是与jmap搭配使用,用来分析jmap生成的dump,jhat内置了一个微型的HTTP/HTML服务器,生成dump的分析结果后,可以在浏览器中查看。在此要注意,一般不会直接在服务器上进行分析,因为jhat是一个耗时并且耗费硬件资源的过程,一般把服务器生成的dump文件复制到本地或其他机器上进行分析。
C:Program Files (x86)Javajdk1.7.0_79in>jhat dump.hprof
Reading from dump.hprof...
Dump file created Wed Apr 18 11:50:35 CST 2018
Snapshot read, resolving...
Resolving 47693 objects...
Chasing references, expect 9 dots.........
Eliminating duplicate references.........
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
通过浏览器访问 http://localhost:7000可以点击 All classes 查看所有对象 可以结合代码 查看是否有大量应该被回收而没有被回收的对象
可以点击 Show heap histogram 查看各种类型对象实例个数
2.javah
开发jni程序可以使用javah转换java类为c++头文件 开发对应dll文件
用法:javah [选项] <类>
其中 [选项] 包括:
-help 输出此帮助消息并退出
-classpath <路径> 用于装入类的路径
-bootclasspath <路径> 用于装入引导类的路径
-d <目录> 输出目录
-o <文件> 输出文件(只能使用 -d 或 -o 中的
-jni 生成 JNI样式的头文件(默认)
-version 输出版本信息
-verbose 启用详细输出
-force 始终写入输出文件
使用全限定名称指定 <类>(例
如,java.lang.Object)。
比如定义了一个java类 可以转换成c的头文件和类
package test;
public class Test{
public final static String hello()
{
System.out.print("hello");
}
native static String chello();
}
使用 C: est 写入Test.java文件
使用命令 javac C: estTest.java 编译
使用 javah命令
cd C:
C:>javah -jni -d C: est test.Test
可以看到 C: est 生成了test_Test.h
jni具体开发 入门参考 https://blog.csdn.net/liaomin416100569/article/details/5672145
3.jps
用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。
使用jps时,如果没有指定hostid,它只会显示本地环境中所有的Java进程;如果指定了hostid,它就会显示指定hostid上面的java进程,不过这需要远程服务上开启了jstatd服务,可以参看前面的jstatd章节来启动jstad服务。
命令格式:
usage: jps [-help]
jps [-q] [-mlvV] [<hostid>]
Definitions:
<hostid>: <hostname>[:<port>]
选项参数:-l : 输出主类全名或jar路径
-q : 只输出LVMID
-m : 输出JVM启动时传递给main()的参数
-v : 输出JVM启动时显示指定的JVM参数
演示实例(比如 启动了带有main方法BlockQueueTest 添加main参数 a b 添加vm参数 -verbose:gc -XX:+PrintGCDetails)C:Usersjiaozi>jps ---只是输出了进程号 运行类名
47984 BlockQueueTest
53236 Jps
49628
C:Usersjiaozi>jps -l ---输出了进程号和完整主类名
47984 cn.quene.BlockQueueTest
52436 sun.tools.jps.Jps
49628
C:Usersjiaozi>jps -lm ---m参数还输出了main类传入的main参数
47984 cn.quene.BlockQueueTest a b
52088 sun.tools.jps.Jps -lm
49628
C:Usersjiaozi>jps -lmv --v参数 输出了 配置的vm参数
47984 cn.quene.BlockQueueTest a b -verbose:gc -XX:+PrintGCDetails -Dfile.encodin
g=GBK
49628 -Dosgi.requiredJavaVersion=1.7 -Xms256m -Xmx1024m -XX:MaxPermSize=256m
53132 sun.tools.jps.Jps -lmv -Dapplication.home=C:Program FilesJavajdk1.8.0_1
31 -Xms8m
添加代码模拟多个线程操作 来分析堆栈
线程的状态:
NEW:新建状态
RUNNABLE:运行状态
BLOCKED:阻塞状态
WAITING:获取到锁 调用了wait方法 等待其他线程调用notify唤醒
TIMED_WAITING 获取到锁 调用了wait(时间)方法 等待其他线程调用notify唤醒或者超时
TERMINATED:线程结束
package test;
/**
* 模拟 线程1 锁定 ts 锁定ts1 让ts的锁释放等待
* 线程2 因为 ts1的锁一直未释放 等待获取ts1的锁
* @author jiaozi
*
*/
public class BlockQueueTest {
static String ts="aa";
static String ts1="aa1";
public static void main(String[] args) {
Thread t1=new Thread(){
@Override
public void run() {
synchronized (ts) {
try {
synchronized (ts1) {
System.out.println("获取线程锁1");
ts.wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t1.setName("线程1");
t1.start();
Thread t2=new Thread(){
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (ts1) {
System.out.println("获取ts1的锁");
}
}
};
t2.setName("线程2");
t2.start();
}
}
使用jstack分析:
C:Program Files (x86)Javajdk1.7.0_79in>jstack 22540
2018-04-19 10:01:48
Full thread dump Java HotSpot(TM) Client VM (24.79-b02 mixed mode, sharing):
"DestroyJavaVM" prio=6 tid=0x04b0ac00 nid=0x5c20 waiting on condition [0x0000000
0]
java.lang.Thread.State: RUNNABLE
"线程2" prio=6 tid=0x04b0a400 nid=0x5c5c waiting for monitor entry [0x04e4f000]
java.lang.Thread.State: BLOCKED (on object monitor) 线程2因为一直获取不到锁 阻塞状态
at test.BlockQueueTest$2.run(BlockQueueTest.java:41)
- 【waiting to】 lock <0x245135d8> (a java.lang.String) 正在想要获取0x245135d8的锁
"线程1" prio=6 tid=0x04b09c00 nid=0x490c in Object.wait() [0x04dbf000]
java.lang.Thread.State: WAITING (on object monitor) 线程1 调用了wait方法 除了waiting状态
at java.lang.Object.wait(Native Method)
- 【waiting on】 <0x245135b0> (a java.lang.String) 在ts对象调用了wait on to区别搞清楚
at java.lang.Object.wait(Object.java:503)
at test.BlockQueueTest$1.run(BlockQueueTest.java:19)
- locked <0x245135d8> (a java.lang.String) 锁定了一个string对象 ts1
- locked <0x245135b0> (a java.lang.String) 锁定了一个string对象 ts
"Service Thread" daemon prio=6 tid=0x00d93000 nid=0x5c58 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE 其他线程都是系统线程
"C1 CompilerThread0" daemon prio=10 tid=0x00d7e400 nid=0x5c48 waiting on conditi
on [0x00000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" daemon prio=10 tid=0x00d7d000 nid=0x5c34 waiting on condition
[0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" daemon prio=10 tid=0x00d6a800 nid=0x5c44 runnable [0x0000000
0]
java.lang.Thread.State: RUNNABLE
"Finalizer" daemon prio=8 tid=0x00cf5c00 nid=0x5c50 in Object.wait() [0x0105f000
]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x24400e48> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135)
- locked <0x24400e48> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
"Reference Handler" daemon prio=10 tid=0x00cf4000 nid=0x5c54 in Object.wait() [0
x0116f000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x24400c70> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:503)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)
- locked <0x24400c70> (a java.lang.ref.Reference$Lock)
"VM Thread" prio=10 tid=0x00cf2800 nid=0x5c40 runnable
"VM Periodic Task Thread" prio=10 tid=0x00dae400 nid=0x5640 waiting on condition
JNI global references: 126
4.jstack
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
命令格式:
C:Usersjiaozi>jstack --help
Usage:
jstack [-l] <pid>
(to connect to running process)
jstack -F [-m] [-l] <pid>
(to connect to a hung process)
jstack [-m] [-l] <executable> <core>
(to connect to a core file)
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
(to connect to a remote debug server)
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process
is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
5.jstat((JVM statistics Monitoring))
Jstat用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
- 类的加载及卸载情况
- 查看新生代、老生代及持久代的容量及使用情况
- 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
- 查看新生代中Eden区及Survior区中容量及分配情况等
jstat工具特别强大,它有众多的可选项,通过提供多种不同的监控维度,使我们可以从不同的维度来了解到当前JVM堆的使用情况。详细查看堆内各个部分的使用量,使用的时候必须加上待统计的Java进程号,可选的不同维度参数以及可选的统计频率参数。
命令格式:
C:Usersjiaozi>jstat --help
invalid argument count
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Definitions:
<option> -选项选择需要统计的数据 查看下标
<vmid> 启动虚拟机ip格式:
<lvmid>[@<hostname>[:<port>]] 远程必须开启jmx
本地可以使用jps查看进程id
<lines> Number of samples between header lines.
<interval> 连续输出的时间间隔 单位可以是:["ms"|"s"] 默认单位是ms
<count> 连续输出的次数 每隔interval时间统计一次 达到count次数 不再统计
-J<flag> Pass <flag> directly to the runtime system.
Option | Displays… |
---|---|
class | class loader的行为统计。Statistics on the behavior of the class loader. |
compiler | HotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler. |
gc | 垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap. |
gccapacity | 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces. |
gcutil | 垃圾回收统计概述。不过输出的是已使用空间占总空间的百分比 |
gccause | 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and |
gcnew | 新生代行为统计。Statistics of the behavior of the new generation. |
gcnewcapacity | 新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces. |
gcold | 年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations. |
gcoldcapacity | 年老代行为统计。Statistics of the sizes of the old generation. |
gcpermcapacity | 永生代行为统计。Statistics of the sizes of the permanent generation. |
printcompilation | HotSpot编译方法统计。HotSpot compilation method statistics. |
-class (监视类装载、卸载数量、总空间以及耗费的时间)
C:Usersjiaozi>jps
47984 BlockQueueTest
60724 Jps
49628
C:Usersjiaozi>jstat -class 47984
Loaded Bytes Unloaded Bytes Time
428 479.8 0 0.0 0.12
- Loaded : 加载class的数量
- Bytes : class字节大小
- Unloaded : 未加载class的数量
- Bytes : 未加载class的字节大小
- Time : 加载时间
-compiler (输出JIT【Just-in-Time 】编译过的方法数量耗时等))
C:Usersjiaozi>jps
47984 BlockQueueTest
59232 Jps
49628
C:Usersjiaozi>jstat -compiler 47984
Compiled Failed Invalid Time FailedType FailedMethod
8 0 0 0.00 0
- Compiled : 编译数量
- Failed : 编译失败数量
- Invalid : 无效数量
- Time : 编译耗时
- FailedType : 失败类型
- FailedMethod : 失败方法的全限定名
C:Usersjiaozi>jps
68596 BlockQueueTest
68104 Jps
49628
C:Usersjiaozi>jstat -gc 68596
Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.metaspace.used substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.capacity substituted NaN
Warning: Unresolved Symbol: sun.gc.compressedclassspace.used substituted NaN
S0C S1C S0U S1U EC EU OC OU MC MU
CCSC CCSU YGC YGCT FGC FGCT GCT
17472.0 17472.0 0.0 0.0 139776.0 8386.6 349568.0 0.0 - -
- - 0 0.000 0 0.000 0.000
这里发现 Warning: Unresolved Symbol: sun.gc.metaspace.capacity substituted NaN 后来发现eclipse启动main方法使用
jdk1.7 jstat是使用jdk1.8 所有出现兼容问题 后续将命令也修改成了jdk1.7就成功兼容 正确输出如下:
这里在main方法中添加vm参数(-Xms512M -XX:PermSize=128M)
C:Program Files (x86)Javajdk1.7.0_79in>jps
69616 BlockQueueTest
65616 Jps
49628
C:Program Files (x86)Javajdk1.7.0_79in>jstat -gc 69616
S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
17472.0 17472.0 0.0 0.0 139776.0 8386.6 349568.0 0.0 131072.0 2 78.2 0 0.000 0 0.000 0.000
C即Capacity 总容量,U即Used 已使用的容量 注意单位都是kb
堆内存=survivor0总+survivor1总+eden总+old代总=17472.0 +17472.0 +139776.0 +349568.0 = 524,288K =512M
- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1U : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- PC 当前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间
eden区/survivor1=139776.0/17472.0 =8 说明 eden和survivor是 8:1:1的比例 老年代空间明显大于新生代
永久内存=PC/1024=131072.0 /1024=128M 和配置一致
新生代和老年代比例: 349568.0/174,720=2
通过jmap也可以统计到:
NewRatio = 2 老年代和新生代比例
SurvivorRatio = 8 eden去和survivor比例
6.jinfo
jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。 之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令
命令格式:
C:Program Files (x86)Javajdk1.7.0_79in>jinfo --help
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> 打印名字是name的vm参数
-flag [+|-]<name> 启用获取禁用vm参数
-flag <name>=<value> 设置vm的参数值
-flags 打印所有设置的vm参数
-sysprops 打印所有 Java system properties
<no option> 没有选项打印上面两种 vm和properties
例如
打印所有vm参数和properties
C:Program Files (x86)Javajdk1.7.0_79in>jinfo 22540
打印某个vm参数C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag MaxPermSize 22540
-XX:MaxPermSize=67108864
开启打印gc日志(PrintGC PrintGCDateStamps PrintGCDetails)具体参数 通过 ( java -XX:+PrintFlagsFinal -version > c:/a.log 查看 )C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag +PrintGC 22
540
启动当fullgc前导出dump文件 C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag +HeapDumpBeforeFullGC 22
540
设置dump文件位置C:Program Files (x86)Javajdk1.7.0_79in>jinfo -flag HeapDumpPath=c:/ttt.hpro
f 22540