linux高级进阶---java进程监控详解
linux高级进阶—java进程监控详解常用java进程监控工具序号命令引文解释作用1jstatJava Virtual Machine statistics monitoring tool主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控2jinfoGenerates configuration information查看
·
linux高级进阶—java进程监控详解
常用java进程监控工具
序号 | 命令 | 引文解释 | 作用 |
---|---|---|---|
1 | jstat | Java Virtual Machine statistics monitoring tool | 主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控 |
2 | jinfo | Generates configuration information | 查看 Java 进程运行的 JVM 参数 |
3 | jstack | Prints Java thread stack traces for a Java process, core file, or remote debug server. This command is experimental and unsupported. | java进程ID或core file或远程调试服务的Java堆栈信息 |
4 | jmap | Prints shared object memory maps or heap memory details for a process, core file, or remote debug server. This command is experimental and unsupported. | 指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 |
5 | jps | Lists the instrumented Java Virtual Machines (JVMs) on the target system | 列出java程序 |
6 | jhat | Analyzes the Java heap | 虚拟机转储快照分析工具 |
1、jstat命令
命令功能:用于收集HotSpot虚拟机各方面的运行数据,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图像界面,只提供了命令行界面的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
命令格式:jstat [option vmid [interval[s|ms] [count]] ]
参数说明:
01、VMID与LVMID需要特别说明下:如果是本地虚拟机进程,VMID和LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:[protocol:][//] lvmid [@hostname[:port]/servername] ,进程号
02、参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次
03、option代表这用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:
-class :监视类装载、卸载数量、总空间及类装载所耗费的时间
-gc 监视Java堆状况,包括Eden区、2个Survivor区、老年代、永久代等的容量
-gccapacity 监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大和最小空间
-gcutil 监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比 (这是博主在性能监控中最常用的选项)
-gccause 与-gcutil功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew 监视新生代GC的状况
-gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大和最小空间
-gcold 监视老年代GC的状况
-gcoldcapacity 监视内容与——gcold基本相同,输出主要关注使用到的最大和最小空间
-gcpermcapacity 输出永久代使用到的最大和最小空间
-compiler 输出JIT编译器编译过的方法、耗时等信息
-printcompilation 输出已经被JIT编译的方法
实例1: jstat -gcutil 20917 5000 2 总结垃圾回收统计
20917:进程ID
5000:间隔时间5000毫秒
2:次数,5000毫秒检测2次
监控结果说明
E:新生代Eden区(E 代表Eden)占用了58.91%的空间
S0,S1: 两个Survivor区(S0、S1 代表Survivor0、Survivor1),其中S0占用了60.32%的空间,S1为0,Eden区空间不足时JVM会将部分活跃的对象放入到Survivor区,这里要注意的是:S0、S1永远只会使用其中一个,即S0、S1一定有一个为0
O:老年代(O 代表Old)占用了83.09%的空间
M:元空间(M 代表Metaspace)占用了89.25%,JDK8及以上版本移除了持久代,引入元空间 (博主服务器安装的是JDK8)
CSS:压缩比例占用85.9% ,该指标一般不用太关注 ,JDK8及以上版本才有
剩余5项:程序运行以来共发生Minor GC(YGC Young GC)1665次,总耗时(YGCT,Young GC Time)215.627秒,发生Full GC(FGC)31次,总耗时(FGCT)57.666秒,所有GC总耗时(GCT)273.293秒
实例2:jstat -gc 20917 5000 3 垃圾回收统计
20917:进程ID
5000:间隔时间5000毫秒
3:次数,5000毫秒检测3次
监控结果说明:
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC:年轻代中Eden(伊甸园)的容量 (字节)
EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC:Old代的容量 (字节)
OU:Old代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC:从应用程序启动到采样时年轻代中gc次数
YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC:从应用程序启动到采样时old代(全gc)gc次数
FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)
NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX:年轻代(young)的最大容量 (字节)
NGC:年轻代(young)中当前的容量 (字节)
OGCMN:old代中初始化(最小)的大小 (字节)
OGCMX:old代的最大容量 (字节)
OGC:old代当前新生成的容量 (字节)
PGCMN:perm代中初始化(最小)的大小 (字节)
PGCMX:perm代的最大容量 (字节)
PGC:perm代当前新生成的容量 (字节)
S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O:old代已使用的占当前容量百分比
P:perm代已使用的占当前容量百分比
S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT: 持有次数限制
MTT : 最大持有次数限制
实例3:jstat -class 20917 统计类及加载数据
监控结果说明:
Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间
实例4:jstat -compiler 20917 编译统计
监控结果说明:
Compiled:编译数量
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法
实例5:jstat -gccapacity 20917 堆内存统计
监控结果说明:
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
EC:伊甸园区的大小
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:当前老年代大小
MCMN:最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代gc次数
FGC:老年代GC次数
实例6:jstat -gcnew 20917 新生代垃圾回收统计
监控结果说明:
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
实例7:jstat -gcnewcapacity 20917 5000 3 新生代内存统计
监控结果说明:
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
实例8:jstat -gcold 20917 5000 3 老年代垃圾回收统计
监控结果说明:
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
实例9:jstat -gcoldcapacity 20917 老年代内存统计
监控结果说明:
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
实例10: jstat -gcmetacapacity 20917 元数据空间统计
监控结果说明:
MCMN: 最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
实例11: jstat -printcompilation 20917 JVM编译方法统计
监控结果说明:
Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型。
Method:方法名标识
2、jinfo命令:
命令功能:用于收集HotSpot虚拟机各方面的运行数据,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图像界面,只提供了命令行界面的服务器上,它将是运行期定位虚拟机性能问题的首选工具。
命令格式:jinfo [ option ] pid
jinfo [ option ] executable core
jinfo [ option ] [ servier-id ] remote-hostname-or-IP
参数说明:
option: 命令行选项
pid : java进程的进程号,可用jps命令查看
executable: 产生核心转储的Java可执行文件
core : 配置信息的核心文件
remote-hostname-or-IP:远程调试服务器主机名或IP地址
server-id:当多个调试服务器在同一个远程主机上运行时使用的可选唯一ID
option命令行选项:
no-option: 显示命令行标志和系统属性名-值对
-flag name:打印指定命令行标志的名称和值
-flag [+|-]name:启用或禁用指定的布尔命令行标志
-flag name=value :将指定的命令行标志设置为指定的值
-flags:打印传递给JVM的命令行标志
-sysprops: 以名称-值对的形式打印Java系统属性
常用 JVM 参数:
-Xms:初始堆大小,默认为物理内存的1/64(<1GB);默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制
-Xmx:最大堆大小,默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn:新生代的内存空间大小,注意:此处的大小是(eden+ 2 survivor space)。与jmap -heap中显示的New gen是不同的。整个堆大小=新生代大小 + 老生代大小 + 永久代大小。在保证堆大小不变的情况下,增大新生代后,将会减小老生代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-XX:SurvivorRatio:新生代中Eden区域与Survivor区域的容量比值,默认值为8。两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
-Xss:每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。应根据应用的线程所需内存大小进行适当调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。一般小的应用, 如果栈不是很深, 应该是128k够用的,大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。和threadstacksize选项解释很类似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”一般设置这个值就可以了。
-XX:PermSize:设置永久代(perm gen)初始值。默认值为物理内存的1/64。
-XX:MaxPermSize:设置持久代最大值。物理内存的1/4。
实例1:查看jvm的非默认的参数值
实例2:查看jvm系统详细参数及环境变量
实例3:查看系统设置值
3、jstack命令:
命令功能:打印Java进程、核心文件或远程调试服务器的Java线程堆栈跟踪
命令格式:jstack [ options ] pid
jstack [ options ] executable core
jstack [ options ] [ server-id@ ] remote-hostname-or-IP
参数说明:
pid : java进程的进程号,可用jps命令查看
executable: 产生核心转储的Java可执行文件
core : 配置信息的核心文件
remote-hostname-or-IP:远程调试服务器主机名或IP地址
server-id:当多个调试服务器在同一个远程主机上运行时使用的可选唯一ID
options:
-F: 当jstack [-l] pid没有响应时,强制堆栈转储
-l: 打印关于锁的附加信息,比如拥有的java.util列表
-m: 打印一个混合模式的堆栈跟踪,包含Java和本机C/ c++框架
实例1:jstack -l 19794
线程分析:
一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。
01、jvm线程
在线程中,有一些 JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:
02、用户级别的线程
还有一类线程是用户级别的,它会根据用户请求的不同而发生变化。该类线程的运行情况往往是我们所关注的重点。而且这一部分也是最容易产生死锁的地方。
从上述的代码示例中我们可以看到该用户线程的以下几类信息:
Ø 线程的状态:waiting on condition(等待条件发生)
Ø 线程的调用情况;
Ø 线程对资源的锁定情况;
线程的状态分析:
线程的状态是一个重要的指标,它会显示在线程每行结尾的地方。那么线程常见的有哪些状态呢?线程在什么样的情况下会进入这种状态呢?我们能从中发现什么线索:
Runnable: 该状态表示线程具备所有运行条件,在运行队列中准备操作系统的调度,或者正在运行
Waiton condition: 该状态出现在线程等待某个条件的发生。具体是什么原因,可以结合stacktrace来分析。
最常见的情况是线程在等待网络的读写,比如当网络数据没有准备好读时,线程处于这种
等待状态,而一旦有数据准备好读之后,线程会重新激活,读取并处理数据。在 Java引入
NIO之前,对于每个网络连接,都有一个对应的线程来处理网络的读写操作,即使没有可读写的数
据,线程仍然阻塞在读写操作上,这样有可能造成资源浪费,而且给操作系统的线程调度也带来
压力。在 NIO里采用了新的机制,编写的服务器程序的性能和可扩展性都得到提高。
如果发现有大量的线程都在处在 Wait on condition,从线程 stack看, 正等待网络读写,这可能
是一个网络瓶颈的征兆。因为网络阻塞导致线程无法执行。一种情况是网络非常忙,几乎消耗了
所有的带宽,仍然有大量数据等待网络读写;另一种情况也可能是网络空闲,但由于路由等问
题,导致包无法正常的到达。所以要结合系统的一些性能观察工具来综合分析,比如 netstat统计
单位时间的发送包的数目,如果很明显超过了所在网络带宽的限制 ; 观察 cpu的利用率,如果系
统态的 CPU时间,相对于用户态的 CPU时间比例较高;如果程序运行在 Solaris 10平台上,可以
用 dtrace工具看系统调用的情况,如果观察到 read/write的系统调用的次数或者运行时间遥遥领
先;这些都指向由于网络带宽所限导致的网络瓶颈。
另外一种出现 Wait on condition的常见情况是该线程在 sleep,等待 sleep的时间到了时候,将
被唤醒。
Waitingfor monitor entry 和 in Object.wait() :在多线程的 JAVA程序中,实现线程之间的同步,就要说说
Monitor。Monitor是Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者
Class的锁。每一个对象都有,也仅有一个 monitor。
实例2:jstack统计线程数 jstack -l 28367 | grep ‘java.lang.Thread.State’ | wc -l
实例3:java应用,CPU使用率一直很高,经常达到100%
方法一:
1.jps 获取Java进程的PID。
2.jstack pid >> java.txt 导出CPU占用高进程的线程栈。
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高。
4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写。
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈。
6.分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
方法二:
1.使用top 定位到占用CPU高的进程PID
top
通过ps aux | grep PID命令
2.获取线程信息,并找到占用CPU高的线程
ps -mp pid -o THREAD,tid,time | sort -rn
3.将需要的线程ID转换为16进制格式
printf "%x\n" tid
4.打印线程的堆栈信息
jstack pid |grep tid -A 30
4、jmap命令:
命令功能:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)
命令格式:jmap [ options ] pid
jmap [ options ] executable core
jmap [ options ] [ pid ] server-id@ ] remote-hostname-or-IP
参数说明:
pid : java进程的进程号,可用jps命令查看
executable: 产生core dump的java可执行程序;
core : 将被打印信息的core dump文件;
remote-hostname-or-IP:远程调试服务器主机名或IP地址
server-id:当多个调试服务器在同一个远程主机上运行时使用的可选唯一ID
options:
<no option>: 当不使用选项时,jmap命令打印共享对象映射。对于加载在目标JVM中的每个共享对象,起始地
址、映射大小和打印共享object文件的完整路径。这种行为类似于Oracle Solaris pmap实用程序。
-dump:[live,] format=b, file=filename :以hprof二进制格式将Java堆转储到filename。live子选项是可选的,但
是在指定时,只转储堆中的活动对象。浏览堆转储时,可以使用jhat(1)命令读取生成的文件。
-finalizerinfo: 打印等待结束的对象的信息
-heap: 打印使用的垃圾收集的堆摘要、头配置和基于生成的堆使用情况。此外,内嵌字符串的数量和大小为
打印出来。
-histo[:live] : 打印堆的直方图。对于每个Java类,将打印对象数量、内存大小(以字节为单位)和完全限定的类
名。JVM内部类名称以星号(*)前缀打印。如果指定了live子选项,则只统计活动对象。
-clstats: 打印Java堆的类装入器统计信息。对于每个类装入器,它的名称、活动程度、地址、父类装入器以及
类的数量和大小已加载的打印。
-F: 当pid没有响应时,使用jmap -dump或jmap -histo选项。在此模式下不支持live子选项
实例1:jmap -dump:live,format=b,file=test.txt 3170,以hprof二进制形式,输出jvm的head内容文件
实例2:jmap -finalizerinfo 3170 ,打印正等候回收的对象的信息
实例3:jmap -heap 3170,打印heap的概要信息,GC使用的算法,heap(堆)的配置及JVM堆内存的使用情况
输出参数解析:
[root@iZ2ze5ij5abr7mlfrjycrrZ ~]# jmap -heap 3170
Attaching to process ID 3170, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.112-b15
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration: # 堆配置情况,也就是JVM参数配置的结果[平常说的tomcat配置JVM参数,就是在配置这些]
MinHeapFreeRatio = 0 # 最小堆使用比例
MaxHeapFreeRatio = 100 # 最大堆可用比例
MaxHeapSize = 4164943872 (3972.0MB) # 最大堆空间大小
NewSize = 87031808 (83.0MB) # 新生代分配大小
MaxNewSize = 1388314624 (1324.0MB) # 最大可新生代分配大小
OldSize = 175112192 (167.0MB) # 老年代大小
NewRatio = 2 # 新生代比例
SurvivorRatio = 8 # 新生代与suvivor的比例
MetaspaceSize = 21807104 (20.796875MB) # 元空间大小,元空间本质跟永久代类似,都是对JVM
规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间并不在虚拟机中,而是使用本机
内存。因此,元空间大小仅受本地内存限制。
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB # MaxMetaspaceSize用于设置metaspace区域的最大值
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: # 堆使用情况【堆内存实际的使用情况】
PS Young Generation # 新生代
Eden Space: # 伊甸区Eden区
capacity = 25690112 (24.5MB) # #伊甸区容量
used = 640848 (0.6111602783203125MB) # 已经使用大小
free = 25049264 (23.888839721679688MB) # 剩余容量
2.4945317482461733% used # 使用率
From Space: # survior1区
capacity = 5767168 (5.5MB) # survior1区容量
used = 0 (0.0MB) # surviror1区已使用情况
free = 5767168 (5.5MB) # surviror1区剩余容量
0.0% used # survior1区使用比例
To Space: # survior2 区
capacity = 6815744 (6.5MB) # survior2区容量
used = 0 (0.0MB) # survior2区已使用情况
free = 6815744 (6.5MB) # survior2区剩余容量
0.0% used # survior2区使用比例
PS Old Generation # 老年代使用情况
capacity = 387973120 (370.0MB) # 老年代容量
used = 20720144 (19.760269165039062MB) # 老年代已使用容量
free = 367252976 (350.23973083496094MB) # 老年代剩余容量
5.340613287848395% used # 老年代使用比例
实例4:jmap -histo:live 3170,打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量
采用jmap -histo pid>a.log日志将其保存,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。
jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具)。
实例5:jmap -clstats 3170, 打印Java堆的类装入器统计信息
5、jps命令:
命令功能:查看java程序列表
命令格式:jps [ options ] [ hostid ]
参数说明:
hostid: hostid可以包含指示通信协议、端口的可选组件编号,以及其他实现特定的数据
options:
-q: 只查看进程ID。
-m: 显示传递给主方法的参数。对于嵌入式jvm,输出可能为null。
-l: 显示应用程序主类的完整包名或应用程序JAR文件的完整路径名。
实例1:jps -l,查看java进程列表,并显示运行得名称
6、jhat命令:
命令功能:主要是用来分析java堆的命令,可以将堆中的对象以 html 的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言(OQL)。
命令格式:jhat [ options ] heap-dump-file
参数说明:
heap-dump-file: 要浏览的Java二进制堆转储文件。对于包含多个堆转储的转储文件,可以通过添加#<number>来指定文件中的转储。
options:
-stack false|true : 关闭对象分配调用栈跟踪(tracking object allocation call stack)。
如果分配位置信息在堆转储中不可用,则必须将此标志设置为 false,默认值为 true.
-refs false|true: 关闭对象引用跟踪(tracking of references to objects)。
默认值为 true,默认情况下,返回的指针是指向其他特定对象的对象,如反向链接或输入引用
-port port-number: 设置 jhat HTTP server 的端口号,默认值 7000.
-exclude exclude-file: 指定对象查询时需要排除的数据成员列表文件(a file that lists data members that
should be excluded from the reachable objects query)。 例如,如果文件列列出了
java.lang.String.value,那么当从某个特定对象 Object o 计算可达的对象列表时,引
用路径涉及 java.lang.String.value 的都会被排除。
-baseline exclude-file: 指定一个基准堆转储(baseline heap dump)。 在两个 heap dumps 中有相同 object
ID 的对象会被标记为不是新的(marked as not being new),其他对象被标记为新的(new),在
比较两个不同的堆转储时很有用。
-debug int: 设置 debug 级别,0 表示不输出调试信息。 值越大则表示输出更详细的 debug 信息
-Jflag: 因为 jhat 命令实际上会启动一个JVM来执行,通过 -J 可以在启动JVM时传入一些启动参数。
例如 -J-Xmx512m 则指定运行 jhat 的Java虚拟机使用的最大堆内存为 512 MB,如果需要使用多个JVM启动参数,则传入多个 -Jxxxxxx.
实例
更多推荐
已为社区贡献1条内容
所有评论(0)