当前位置:   article > 正文

linux高级进阶---java进程监控详解_linux监控java进程

linux监控java进程

linux高级进阶—java进程监控详解

常用java进程监控工具

序号命令引文解释作用
1jstatJava Virtual Machine statistics monitoring tool主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控
2jinfoGenerates configuration information查看 Java 进程运行的 JVM 参数
3jstackPrints 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堆栈信息
4jmapPrints shared object memory maps or heap memory details for a process, core file, or remote debug server. This command is experimental and unsupported.指定Java进程(或核心文件、远程调试服务器)的共享对象内存映射或堆内存细节。
5jpsLists the instrumented Java Virtual Machines (JVMs) on the target system列出java程序
6jhatAnalyzes 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

实例1: jstat -gcutil 20917 5000 2 总结垃圾回收统计

20917:进程ID
5000:间隔时间5000毫秒
2:次数,5000毫秒检测2次
  • 1
  • 2
  • 3

在这里插入图片描述

监控结果说明
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秒
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实例2:jstat -gc 20917 5000 3 垃圾回收统计

20917:进程ID
5000:间隔时间5000毫秒
3:次数,5000毫秒检测3次
  • 1
  • 2
  • 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 : 最大持有次数限制  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

实例3:jstat -class 20917 统计类及加载数据

在这里插入图片描述

监控结果说明:
	    Loaded:加载class的数量
	    Bytes:所占用空间大小
	    Unloaded:未加载数量
	    Bytes:未加载占用空间
	    Time:时间
  • 1
  • 2
  • 3
  • 4
  • 5

实例4:jstat -compiler 20917 编译统计

在这里插入图片描述

监控结果说明:
	    Compiled:编译数量
	    Failed:失败数量
	    Invalid:不可用数量
	    Time:时间
	    FailedType:失败类型
	    FailedMethod:失败的方法
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

实例5:jstat -gccapacity 20917 堆内存统计

在这里插入图片描述

监控结果说明:
	NGCMN:新生代最小容量
	NGCMX:新生代最大容量
	NGC:当前新生代容量
	S0C:第一个幸存区大小
	S1C:第二个幸存区的大小
	EC:伊甸园区的大小
	OGCMN:老年代最小容量
	OGCMX:老年代最大容量
	OGC:当前老年代大小
	OC:当前老年代大小
	MCMN:最小元数据容量
	MCMX:最大元数据容量
	MC:当前元数据空间大小
	CCSMN:最小压缩类空间大小
	CCSMX:最大压缩类空间大小
	CCSC:当前压缩类空间大小
	YGC:年轻代gc次数
	FGC:老年代GC次数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

实例6:jstat -gcnew 20917 新生代垃圾回收统计

在这里插入图片描述

监控结果说明:
	S0C:第一个幸存区大小
	S1C:第二个幸存区的大小
	S0U:第一个幸存区的使用大小
	S1U:第二个幸存区的使用大小
	TT:对象在新生代存活的次数
	MTT:对象在新生代存活的最大次数
	DSS:期望的幸存区大小
	EC:伊甸园区的大小
	EU:伊甸园区的使用大小
	YGC:年轻代垃圾回收次数
	YGCT:年轻代垃圾回收消耗时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实例7:jstat -gcnewcapacity 20917 5000 3 新生代内存统计

在这里插入图片描述

监控结果说明:
	    NGCMN:新生代最小容量
	    NGCMX:新生代最大容量
	    NGC:当前新生代容量
	    S0CMX:最大幸存1区大小
	    S0C:当前幸存1区大小
	    S1CMX:最大幸存2区大小
	    S1C:当前幸存2区大小
	    ECMX:最大伊甸园区大小
	    EC:当前伊甸园区大小
	    YGC:年轻代垃圾回收次数
	    FGC:老年代回收次数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

实例8:jstat -gcold 20917 5000 3 老年代垃圾回收统计

在这里插入图片描述

监控结果说明:
	    MC:方法区大小
	    MU:方法区使用大小
	    CCSC:压缩类空间大小
	    CCSU:压缩类空间使用大小
	    OC:老年代大小
	    OU:老年代使用大小
	    YGC:年轻代垃圾回收次数
	    FGC:老年代垃圾回收次数
	    FGCT:老年代垃圾回收消耗时间
	    GCT:垃圾回收消耗总时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

实例9:jstat -gcoldcapacity 20917 老年代内存统计

在这里插入图片描述

监控结果说明:
	    OGCMN:老年代最小容量
	    OGCMX:老年代最大容量
	    OGC:当前老年代大小
	    OC:老年代大小
	    YGC:年轻代垃圾回收次数
	    FGC:老年代垃圾回收次数
	    FGCT:老年代垃圾回收消耗时间
	    GCT:垃圾回收消耗总时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

实例10: jstat -gcmetacapacity 20917 元数据空间统计

在这里插入图片描述

监控结果说明:
	    MCMN: 最小元数据容量
	    MCMX:最大元数据容量
	    MC:当前元数据空间大小
	    CCSMN:最小压缩类空间大小
	    CCSMX:最大压缩类空间大小
	    CCSC:当前压缩类空间大小
	    YGC:年轻代垃圾回收次数
	    FGC:老年代垃圾回收次数
	    FGCT:老年代垃圾回收消耗时间
	    GCT:垃圾回收消耗总时间
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

实例11: jstat -printcompilation 20917 JVM编译方法统计

在这里插入图片描述

监控结果说明:
		Compiled:最近编译方法的数量
		Size:最近编译方法的字节码数量
		Type:最近编译方法的编译类型。
		Method:方法名标识
  • 1
  • 2
  • 3
  • 4

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

实例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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

实例1:jstack -l 19794

在这里插入图片描述

线程分析:
	一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。
  • 1
01、jvm线程
	在线程中,有一些 JVM内部的后台线程,来执行譬如垃圾回收,或者低内存的检测等等任务,这些线程往往在JVM初始化的时候就存在,如下所示:
  • 1

在这里插入图片描述

02、用户级别的线程
	还有一类线程是用户级别的,它会根据用户请求的不同而发生变化。该类线程的运行情况往往是我们所关注的重点。而且这一部分也是最容易产生死锁的地方。
  • 1

在这里插入图片描述

	从上述的代码示例中我们可以看到该用户线程的以下几类信息:

		Ø 线程的状态:waiting on condition(等待条件发生)
		
		Ø 线程的调用情况;
		
		Ø 线程对资源的锁定情况;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
线程的状态分析:
	线程的状态是一个重要的指标,它会显示在线程每行结尾的地方。那么线程常见的有哪些状态呢?线程在什么样的情况下会进入这种状态呢?我们能从中发现什么线索:
		
			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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

实例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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
方法二:
			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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

实例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    # 老年代使用比例
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

实例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(内存分析工具)。
  • 1
  • 2
  • 3

实例5:jmap -clstats 3170, 打印Java堆的类装入器统计信息

在这里插入图片描述

5、jps命令:

	命令功能:查看java程序列表
	
	命令格式:jps [ options ] [ hostid ]
	
	参数说明:
			hostid: hostid可以包含指示通信协议、端口的可选组件编号,以及其他实现特定的数据

	options:
			-q: 只查看进程ID。
          
   			-m: 显示传递给主方法的参数。对于嵌入式jvm,输出可能为null。
         
   			-l: 显示应用程序主类的完整包名或应用程序JAR文件的完整路径名。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

实例1:jps -l,查看java进程列表,并显示运行得名称

在这里插入图片描述

6、jhat命令:

	命令功能:主要是用来分析java堆的命令,可以将堆中的对象以 html 的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言(OQL)。
	
	命令格式:jhat [ options ] heap-dump-file
	
	参数说明:
			heap-dump-file: 要浏览的Java二进制堆转储文件。对于包含多个堆转储的转储文件,可以通过添加#&lt;number&gt;来指定文件中的转储。

	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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

实例

在这里插入图片描述

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/554128
推荐阅读
相关标签
  

闽ICP备14008679号