赞
踩
序号 | 命令 | 引文解释 | 作用 |
---|---|---|---|
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 | 虚拟机转储快照分析工具 |
命令功能:用于收集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编译的方法
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秒
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 : 最大持有次数限制
Loaded:加载class的数量
Bytes:所占用空间大小
Unloaded:未加载数量
Bytes:未加载占用空间
Time:时间
Compiled:编译数量
Failed:失败数量
Invalid:不可用数量
Time:时间
FailedType:失败类型
FailedMethod:失败的方法
NGCMN:新生代最小容量 NGCMX:新生代最大容量 NGC:当前新生代容量 S0C:第一个幸存区大小 S1C:第二个幸存区的大小 EC:伊甸园区的大小 OGCMN:老年代最小容量 OGCMX:老年代最大容量 OGC:当前老年代大小 OC:当前老年代大小 MCMN:最小元数据容量 MCMX:最大元数据容量 MC:当前元数据空间大小 CCSMN:最小压缩类空间大小 CCSMX:最大压缩类空间大小 CCSC:当前压缩类空间大小 YGC:年轻代gc次数 FGC:老年代GC次数
S0C:第一个幸存区大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
TT:对象在新生代存活的次数
MTT:对象在新生代存活的最大次数
DSS:期望的幸存区大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
NGCMN:新生代最小容量
NGCMX:新生代最大容量
NGC:当前新生代容量
S0CMX:最大幸存1区大小
S0C:当前幸存1区大小
S1CMX:最大幸存2区大小
S1C:当前幸存2区大小
ECMX:最大伊甸园区大小
EC:当前伊甸园区大小
YGC:年轻代垃圾回收次数
FGC:老年代回收次数
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
OC:老年代大小
OU:老年代使用大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
OGCMN:老年代最小容量
OGCMX:老年代最大容量
OGC:当前老年代大小
OC:老年代大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
MCMN: 最小元数据容量
MCMX:最大元数据容量
MC:当前元数据空间大小
CCSMN:最小压缩类空间大小
CCSMX:最大压缩类空间大小
CCSC:当前压缩类空间大小
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
Compiled:最近编译方法的数量
Size:最近编译方法的字节码数量
Type:最近编译方法的编译类型。
Method:方法名标识
命令功能:用于收集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。
命令功能:打印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++框架
一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。
在线程中,有一些 JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:
还有一类线程是用户级别的,它会根据用户请求的不同而发生变化。该类线程的运行情况往往是我们所关注的重点。而且这一部分也是最容易产生死锁的地方。
从上述的代码示例中我们可以看到该用户线程的以下几类信息:
Ø 线程的状态: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。
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
命令功能:打印出某个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子选项
[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 # 老年代使用比例
采用jmap -histo pid>a.log日志将其保存,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。
jmap -dump:format=b,file=outfile 3024可以将3024进程的内存heap输出出来到outfile文件里,再配合MAT(内存分析工具)。
命令功能:查看java程序列表
命令格式:jps [ options ] [ hostid ]
参数说明:
hostid: hostid可以包含指示通信协议、端口的可选组件编号,以及其他实现特定的数据
options:
-q: 只查看进程ID。
-m: 显示传递给主方法的参数。对于嵌入式jvm,输出可能为null。
-l: 显示应用程序主类的完整包名或应用程序JAR文件的完整路径名。
命令功能:主要是用来分析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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。