当前位置:   article > 正文

Java虚拟机五:常用内存分析命令和工具_linux vm.system-properties

linux vm.system-properties

一、常用命令

1、jps

  jps(JVM Process Status),可以列出虚拟机内的进程,并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID,该ID与操作系统的进程ID一致,jps命令格式为:  jps [options] [hostid] 

  其中options为该命令的选项,hostid为虚拟机中进程的唯一ID,也是linux下系统中进程的pid,options有如下取值:

选项说明
-q只显示进程id,不显示主类
-m输出虚拟机进程启动时传递给主类的参数
-l列出主类的全名,如果进程执行的是Jar包,则列出Jar包的路径
-v输出虚拟机进程启动时候的参数

  命令示例如下:

  1. [root@localhost software]# jps
  2. 74946 Jps
  3. 65684 Bootstrap
  4. [root@localhost software]# jps -q
  5. 65684
  6. 75052
  7. [root@localhost software]# jps -l
  8. 65684 org.apache.catalina.startup.Bootstrap
  9. 75160 sun.tools.jps.Jps
  10. [root@localhost software]# jps -m
  11. 75298 Jps -m
  12. 65684 Bootstrap start
  13. [root@localhost software]# jps -v
  14. 65684 Bootstrap -Djava.util.logging.config.file=/usr/local/tomcat8
  15. /conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
  16. -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
  17. -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs
  18. = -Dcatalina.base=/usr/local/tomcat8 -Dcatalina.home=/usr/local/tomcat8
  19. -Djava.io.tmpdir=/usr/local/tomcat8/temp
  20. 75628 Jps -Denv.class.path=/usr/local/jdk/lib/
  21. -Dapplication.home=/usr/local/jdk -Xms8m
  22. [root@localhost software]#

 

 2、jstat

  jstat(JVM Statistics Monitoring Tool)命令主要用来监控虚拟机运行状态信息,其命令格式为 jstat [options] [vmid] [interval[m|ms]] [count] 

  其中,options选项用来确定需要监视虚拟机的哪部分数据,vmid为本地虚拟机进程id,interval用于控制监控的时间间隔,可以加m|ms单位,count用来控制监控的次数。options选项取值如下:

选项说明
-class监控类装载,卸载数量,总空间以及类装载所耗费的时间
-gc监视Java堆状况,包括Eden区,两个Survivor区,老年代等的容量,已用空间,GC时间合计等信息
-gccapacity监视内容与-gc一样,但只要关注Java堆中各个区域使用到的最大,最小空间
-gcutil监视内容与-gc一样,但只要关注已使用空间占总空间的百分比
-gccause与-gcutil功能一样,但会额外输出导致上一次GC的原因
-gcnew监视新生代GC状况
-gcnewcapacity监视内容与-gcnew一样,但是主要关注使用新生代使用的最大,最小空间
-gcold监视老年代GC状况
-gcoldcapacity监视内容与-gcold一样,但是主要关注老年代使用的最大,最小空间
-compiler输出JIT编译器编译过的方法,耗时等信息
-printcompilation输出已经被JIT编译的方法

  命令示例如下:

  1. [root@localhost software]# jstat -gc 65684 1s 2
  2. S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
  3. 704.0 704.0 0.0 0.0 6016.0 1369.2 14820.0 6365.8 18176.0 17511.6 2048.0 1922.7 12 0.134 2 0.392 0.526
  4. 704.0 704.0 0.0 0.0 6016.0 1369.2 14820.0 6365.8 18176.0 17511.6 2048.0 1922.7 12 0.134 2 0.392 0.526
  5. [root@localhost software]# jstat -gcold 65684 1s 2
  6. MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
  7. 18176.0 17511.6 2048.0 1922.7 14820.0 6365.8 12 2 0.392 0.526
  8. 18176.0 17511.6 2048.0 1922.7 14820.0 6365.8 12 2 0.392 0.526
  9. [root@localhost software]#
 

3、jmap

  jmap命令的主要作用是生成堆转储文件,其命令格式为: jmap [option] vmid 

  其中,option的取值有如下几种:

选项说明
-dump用于生成堆转储快照文件,命令格式为:jmap -dump:[live,]format=b,file=<filename>,其中live参数表示只dump出存活的对象,命令示例: jmap -dump:format=b,file=./result.hprof 65684 ;或者 jmap -dump:live,format=b,file=./result.hprof 65684 
-finalizerinfo显示在F-QUeue中等待Finalizer线程执行finalize方法的对象,如: jmap -finalizerinfo 65684 
-heap显示Java堆详细信息,如使用哪种垃圾回收期,参数配置,分代状况等。如: jmap -heap 65684 
-histo显示堆中对象统计信息,包括类,实例数量,合计容量。如: jmap -histo 65684 
-F当虚拟机对-dump命令没有响应的时候,可以使用该参数强制生成dump文件

  常用例子:

  (1)生成dump文件:

[root@localhost software]# jmap -dump:format=b,file=./dumpresult.hprof 65684
Dumping heap to /software/dumpresult.hprof ...
Heap dump file created
[root@localhost software]# 

  (2)查看Java堆详细信息:

  1. [root@localhost software]# jmap -heap 65684
  2. Attaching to process ID 65684, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 25.211-b12
  6. using thread-local object allocation.
  7. Mark Sweep Compact GC
  8. Heap Configuration:
  9. MinHeapFreeRatio = 40
  10. MaxHeapFreeRatio = 70
  11. MaxHeapSize = 257949696 (246.0MB)
  12. NewSize = 5570560 (5.3125MB)
  13. MaxNewSize = 85983232 (82.0MB)
  14. OldSize = 11206656 (10.6875MB)
  15. NewRatio = 2
  16. SurvivorRatio = 8
  17. MetaspaceSize = 21807104 (20.796875MB)
  18. CompressedClassSpaceSize = 1073741824 (1024.0MB)
  19. MaxMetaspaceSize = 17592186044415 MB
  20. G1HeapRegionSize = 0 (0.0MB)
  21. Heap Usage:
  22. New Generation (Eden + 1 Survivor Space):
  23. capacity = 6881280 (6.5625MB)
  24. used = 1330704 (1.2690582275390625MB)
  25. free = 5550576 (5.2934417724609375MB)
  26. 19.338030133928573% used
  27. Eden Space:
  28. capacity = 6160384 (5.875MB)
  29. used = 1330704 (1.2690582275390625MB)
  30. free = 4829680 (4.6059417724609375MB)
  31. 21.60099110704787% used
  32. From Space:
  33. capacity = 720896 (0.6875MB)
  34. used = 0 (0.0MB)
  35. free = 720896 (0.6875MB)
  36. 0.0% used
  37. To Space:
  38. capacity = 720896 (0.6875MB)
  39. used = 0 (0.0MB)
  40. free = 720896 (0.6875MB)
  41. 0.0% used
  42. tenured generation:
  43. capacity = 15175680 (14.47265625MB)
  44. used = 6518560 (6.216583251953125MB)
  45. free = 8657120 (8.256072998046875MB)
  46. 42.953989541160595% used
  47. 13442 interned Strings occupying 1162192 bytes.
  48. [root@localhost software]#
 

4、jstack

  jstack用于生成虚拟机当前时刻的线程快照(threaddump文件),命令格式为 jstack [option] vmid 。

  其中option具体取值如下:

参数说明
-F当正常输出的请求不被响应时,强制输出线程堆栈
-l除堆栈外,显示关于锁的信息
-m如果调用到本地方法的话,可以显示C/C++的堆栈

 

  使用 jstack -l 65684>./result.txt 命令,将线程堆栈保存到result.txt中进行分析

5.jcmd

  jcmd命令格式为 jcmd [vmid] [option] ,具体的option取值,可以使用 jcmd [vmid] help 命令查看:

  1. [root@localhost software]# jcmd 65684 help
  2. 65684:
  3. The following commands are available:
  4. JFR.stop
  5. JFR.start
  6. JFR.dump
  7. JFR.check
  8. VM.native_memory
  9. VM.check_commercial_features
  10. VM.unlock_commercial_features
  11. ManagementAgent.stop
  12. ManagementAgent.start_local
  13. ManagementAgent.start
  14. VM.classloader_stats
  15. GC.rotate_log
  16. Thread.print
  17. GC.class_stats
  18. GC.class_histogram
  19. GC.heap_dump
  20. GC.finalizer_info
  21. GC.heap_info
  22. GC.run_finalization
  23. GC.run
  24. VM.uptime
  25. VM.dynlibs
  26. VM.flags
  27. VM.system_properties
  28. VM.command_line
  29. VM.version
  30. help
  31. For more information about a specific command use 'help <command>'.
  32. [root@localhost software]#

使用示例:使用jcmd打印NativeMemoryTracking,分析堆外内存

  首先需要配置JVM参数 -XX:NativeMemoryTracking=[off | summary | detail] 。在tomcat的 catalina.sh 中加入 JAVA_OPTS="-XX:NativeMemoryTracking=detail" ,然后使用命令 jcmd 112352 VM.native_memory summary 查看内存:

  1. [root@localhost bin]# jcmd 112352 VM.native_memory summary
  2. 112352:
  3. Native Memory Tracking:
  4. Total: reserved=1614878KB, committed=85806KB
  5. - Java Heap (reserved=251904KB, committed=16384KB)
  6. (mmap: reserved=251904KB, committed=16384KB)
  7. - Class (reserved=1063348KB, committed=15412KB)
  8. (classes #2372)
  9. (malloc=436KB #2468)
  10. (mmap: reserved=1062912KB, committed=14976KB)
  11. - Thread (reserved=42331KB, committed=42331KB)
  12. (thread #42)
  13. (stack: reserved=42148KB, committed=42148KB)
  14. (malloc=135KB #207)
  15. (arena=48KB #80)
  16. - Code (reserved=250457KB, committed=5605KB)
  17. (malloc=857KB #1584)
  18. (mmap: reserved=249600KB, committed=4748KB)
  19. - GC (reserved=836KB, committed=72KB)
  20. (malloc=8KB #109)
  21. (mmap: reserved=828KB, committed=64KB)
  22. - Compiler (reserved=141KB, committed=141KB)
  23. (malloc=10KB #89)
  24. (arena=131KB #5)
  25. - Internal (reserved=783KB, committed=783KB)
  26. (malloc=751KB #3761)
  27. (mmap: reserved=32KB, committed=32KB)
  28. - Symbol (reserved=4358KB, committed=4358KB)
  29. (malloc=2848KB #17221)
  30. (arena=1511KB #1)
  31. - Native Memory Tracking (reserved=544KB, committed=544KB)
  32. (malloc=118KB #1670)
  33. (tracking overhead=426KB)
  34. - Arena Chunk (reserved=176KB, committed=176KB)
  35. (malloc=176KB)
  36. [root@localhost bin]#
 
 

二、常用工具

  MAT(Eclipse Memory Analyzer )是一个Eclipse插件,可以在Eclipse中安装,也可以独立运行。使用MAT进行内存分析非常方便。其下载地址为:https://www.eclipse.org/mat/downloads.php

  选择合适的版本下载,解压后即可使用。

  要分析内存,首先要获取dump文件,可以通过配置JVM参数 -XX:+HeapDumpOnOutOfMemoryError ,让虚拟机在内存溢出的时候dump出内存快照,也可以使用 jmap -dump:format=b,file=./dumpresult.hprof 65684 命令随时dump出内存快照。

  打开MAT后,点击“Open a Heap Dump”选择dump文件,会弹出如下界面:

  

  选择“Leak Suspects Report”生成内存泄漏分析报告:

  

  MAT会以饼图的形式列出发生内存溢出时候,堆内存中占用内存最大的的几个对象。点击“Leak Suspects”查看内存泄漏分析报告:

  

  

  MAT分析结果认为导致内存泄漏的原因有两点,问题1大意是0xff993af0 http-nio-8080-exec-1这个线程持有的本地变量占用了50.20%的内存,点击Detail可以查看具体的分析结果:

  

  分析结果中列出了内存中对象统计结果,按照类进行统计的结果,可以看到有此时内存中共有com.demo.ssm.entity.User类的对象50428个,这些对象的保留堆大小为15,330,112kb。同时0xfe990000的这个Object中保存了56*20=1120个User对象,而这个Object是被0xffa65ff0这个ArrayList引用的,该Object和ArrayList占用堆内存50.18%。按照这些信息,排查代码中向ArrayList中添加User对象的操作,可以找出内存溢出的原因。

  关于MAT的使用要点,可以参考:https://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号