Linux监控JVM常用命令解析

Dear 丶 2022-09-28 13:25 495阅读 0赞

在开发中,随着对底层的不断学习中,JVM将是一个必须要掌握的模块。下面就记录一下常用的工具命令:
JDK内置工具使用

  1. jps(Java Virtual Machine Process Status Tool)
  2. 查看所有的jvm进程,包括进程ID,进程启动的路径等等。
  3. jstack(Java Stack Trace)
  4. 观察jvm中当前所有线程的运行情况和线程当前状态。
  5. 系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stacknative stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
  6. 系统hung住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stacknative stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
  7. jstat(Java Virtual Machine Statistics Monitoring Tool)
  8. jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloadercompilergc情况;
  9. ②监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
  10. jmap(Java Memory Map)
  11. 监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;
  12. jinfo(Java Configuration Info)
  13. 观察进程运行环境参数,包括Java System属性和JVM命令行参数

具体命令使用:

  1. jstat
  2. generalOption
  3. -help 显示帮助信息。
  4. -version 显示版本信息
  5. -options 显示统计选项列表。
  6. outputOptions
  7. #参数:
  8. -class:统计类装载器的行为
  9. -compiler:统计HotSpot Just-in-Time编译器的行为
  10. -gc:统计堆各个分区的使用情况
  11. -gccapacity:统计新生区,老年区,permanent区的heap容量情况
  12. -gccause:统计最后一次gc和当前gc的原因
  13. -gcnew:统计gc时,新生代的情况
  14. -gcnewcapacity:统计新生代大小和空间
  15. -gcold:统计老年代和永久代的行为
  16. -gcoldcapacity:统计老年代大小
  17. -gcpermcapacity:统计永久代大小
  18. -gcutil:统计gc时,heap情况
  19. -printcompilationHotSpot编译方法统计
  20. -class
  21. #每隔1秒监控一次,一共做10次
  22. jstat -class 17970 1000 10
  23. ##########################################
  24. [root@lq225 conf]# jstat -class 2058 1000 10
  25. Loaded Bytes Unloaded Bytes Time
  26. 1697 3349.5 0 0.0 1.79
  27. 1697 3349.5 0 0.0 1.79
  28. 1697 3349.5 0 0.0 1.79
  29. 1697 3349.5 0 0.0 1.79
  30. ...................................................
  31. ######################## 术语分隔符 ########################
  32. #Loaded 类加载数量
  33. #Bytes 加载的大小(k)
  34. #Unloaded 类卸载的数量
  35. #Bytes 卸载的大小(k)
  36. #Time 时间花费在执行类加载和卸载操作
  37. -compiler
  38. Compiled Failed Invalid Time FailedType FailedMethod
  39. 302 0 0 1.27 0
  40. .....................................................
  41. ######################## 术语分隔符 ########################
  42. #Compiled 编译任务的执行次数
  43. #Failed 编译任务的失败次数
  44. #Invalid 编译任务无效的次数
  45. #Time 编译任务花费的时间
  46. #FailedType 最后一次编译错误的类型
  47. #FailedMethod 最后一次编译错误的类名和方法
  48. -gc
  49. #每隔2秒监控一次,共20次
  50. jstat -gc 2058 2000 20
  51. ##############################
  52. S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
  53. 8704.0 8704.0 805.5 0.0 69952.0 64174.5 174784.0 2644.5 16384.0 10426.7 2 0.034 0 0.000 0.034
  54. 8704.0 8704.0 805.5 0.0 69952.0 64174.5 174784.0 2644.5 16384.0 10426.7 2 0.034 0 0.000 0.034
  55. 8704.0 8704.0 805.5 0.0 69952.0 64174.5 174784.0 2644.5 16384.0 10426.7 2 0.034 0 0.000 0.034
  56. .............................................
  57. ######################## 术语分隔符 ########################
  58. #S0C 生还者区0 容量(KB)
  59. #S1C 生还者区1 容量(KB)
  60. #S0U 生还者区0 使用量(KB)
  61. #S1U 生还者区1 使用量(KB)
  62. #EC 伊甸园区容量(KB)
  63. #EU 伊甸园区使用量(KB)
  64. #OC 老年区容量(KB)
  65. #OU 老年区使用量(KB)
  66. #PC 永久区容量(KB)
  67. #PU 永久区使用量(KB)
  68. #YGC 新生代GC次数
  69. #YGCT 新生代GC时间
  70. #FGC full GC 事件的次数
  71. #FGCT full GC的时间
  72. #GCT 总GC时间
  73. -gccapacity
  74. NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC
  75. 131072.0 131072.0 131072.0 13056.0 13056.0 104960.0 393216.0 393216.0 393216.0 393216.0 65536.0 65536.0 65536.0 65536.0 1 0
  76. ..........................................................................................................
  77. ######################## 术语分隔符 ########################
  78. #NGCMN 最小新生代容量(KB)
  79. #NGCMX 最大新生代容量(KB)
  80. #NGC 当前新生代容量(KB)
  81. #S0C 当前生存者0区容量(KB)
  82. #S1C 当前生存者1区容量(KB)
  83. #OGCMN 老年代最小容量(KB)
  84. #OGCMX 老年代最大容量(KB)
  85. #OGC 当前老年代容量(KB).
  86. #OC 当前老年代?Current old space capacity (KB).
  87. #PGCMN 永久区最小容量(KB)
  88. #PGCMX 永久区最大容量(KB)
  89. #PGC 当前永久区容量(KB).
  90. #PC 当前永久区?Current Permanent space capacity (KB).
  91. #YGC young GC事件的次数
  92. #FGC Full GC次数
  93. -gccause
  94. S0 S1 E O P YGC YGCT FGC FGCT GCT LGCC GCC
  95. 0.00 99.84 12.76 0.92 46.23 1 0.016 0 0.000 0.016 unknown GCCause No GC
  96. ................................................
  97. ######################## 术语分隔符 ########################
  98. #S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  99. #S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  100. #E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
  101. #O old代已使用的占当前容量百分比
  102. #P perm代已使用的占当前容量百分比
  103. #YGC 从应用程序启动到采样时年轻代中gc次数
  104. #FGC 从应用程序启动到采样时old代(全gc)gc次数
  105. #FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
  106. #GCT 从应用程序启动到采样时gc用的总时间(s)
  107. #LGCC 最后一次GC的原因
  108. #GCC 当前GC的原因
  109. 例如 -gcutil
  110. #每隔1秒监控一次,共10次
  111. jstat -gcutil 2058 1000 10
  112. ################################
  113. [root@lq225 conf]# jstat -gcutil 2058 1000 10
  114. S0 S1 E O P YGC YGCT FGC FGCT GCT
  115. 9.25 0.00 96.73 1.51 63.64 2 0.034 0 0.000 0.034
  116. 9.25 0.00 96.73 1.51 63.64 2 0.034 0 0.000 0.034
  117. 9.25 0.00 96.73 1.51 63.64 2 0.034 0 0.000 0.034
  118. 9.25 0.00 96.73 1.51 63.64 2 0.034 0 0.000 0.034
  119. jmap
  120. #参数
  121. -dump:[live,]format=b,file=<filename> 使用hprof二进制形式,输出jvmheap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
  122. -finalizerinfo 打印正等候回收的对象的信息.
  123. -heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
  124. -histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
  125. -permstat 打印classloadjvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
  126. -F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
  127. -h | -help 打印辅助信息
  128. -J 传递参数给jmap启动的jvm.
  129. pid 需要被打印配相信息的java进程id.
  130. 例如 -histo
  131. jmap -histo 2058
  132. ############################
  133. num #instances #bytes class name
  134. ----------------------------------------------
  135. 1: 206 3585312 [I
  136. 2: 19621 2791880 <constMethodKlass>
  137. 3: 19621 2520048 <methodKlass>
  138. 4: 21010 2251616 [C
  139. ............................................................
  140. 例如 -dump
  141. #生成的文件可以使用jhat工具进行分析,在OOM(内存溢出)时,分析大对象,非常有用
  142. jmap -dump:live,format=b,file=data.hprof 2058
  143. #通过使用如下参数启动JVM,也可以获取到dump文件:
  144. -XX:+HeapDumpOnOutOfMemoryError
  145. -XX:HeapDumpPath=./java_pid<pid>.hprof
  146. #如果在虚拟机中导出的heap信息文件可以拿到WINDOWS上进行分析,可以查找诸如内存方面的问题,可以这么做:
  147. jhat data.hprof
  148. #执行成功后,访问http://localhost:7000即可查看内存信息。(首先把7000端口打开)
  149. jinfo
  150. #查看java进程的配置信息
  151. jinfo 2058
  152. #####################
  153. Attaching to process ID 2058, please wait...
  154. Debugger attached successfully.
  155. Server compiler detected.
  156. JVM version is 24.0-b56
  157. Java System Properties:
  158. java.runtime.name = Java(TM) SE Runtime Environment
  159. project.name = Amoeba-MySQL
  160. java.vm.version = 24.0-b56
  161. sun.boot.library.path = /usr/local/java/jdk1.7/jre/lib/amd64
  162. ................................................
  163. # 查看2058的MaxPerm大小可以用
  164. jinfo -flag MaxPermSize 2058
  165. ############################
  166. -XX:MaxPermSize=100663296
  167. jps
  168. #列出系统中所有的java进程
  169. jps
  170. #######################
  171. 2306 Bootstrap
  172. 3370 Jps 2058 xxxxxxxxx
  173. 一些术语的中文解释
  174. S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  175. S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  176. S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  177. S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  178. EC:年轻代中Eden(伊甸园)的容量 (字节)
  179. EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
  180. OCOld代的容量 (字节)
  181. OUOld代目前已使用空间 (字节)
  182. PCPerm(持久代)的容量 (字节)
  183. PUPerm(持久代)目前已使用空间 (字节)
  184. YGC:从应用程序启动到采样时年轻代中gc次数
  185. YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
  186. FGC:从应用程序启动到采样时old代(全gc)gc次数
  187. FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  188. GCT:从应用程序启动到采样时gc用的总时间(s)
  189. NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
  190. NGCMX:年轻代(young)的最大容量 (字节)
  191. NGC:年轻代(young)中当前的容量 (字节)
  192. OGCMNold代中初始化(最小)的大小 (字节)
  193. OGCMXold代的最大容量 (字节)
  194. OGCold代当前新生成的容量 (字节)
  195. PGCMNperm代中初始化(最小)的大小 (字节)
  196. PGCMXperm代的最大容量 (字节)
  197. PGCperm代当前新生成的容量 (字节)
  198. S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  199. S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  200. E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
  201. Oold代已使用的占当前容量百分比
  202. Pperm代已使用的占当前容量百分比
  203. S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
  204. S1CMX:年轻代中第二个survivor(幸存区)的最大容量 (字节)
  205. ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
  206. DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
  207. TT 持有次数限制
  208. MTT 最大持有次数限制

使用visualvm监控tomcat

  1. 修改catalina.sh,添加下面一行:
  2. CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=192.168.55.255 -Dcom.sun.management.jmxremote.port=8086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
  3. #注意点:
  4. #1、用hostname -i 查看是否为127.0.01,如果是,则必须配置-Djava.rmi.server.hostname为本机IP。
  5. #2、检查防火墙(iptables)是否开启,以及是否开放jmxremote.port所指定的端口。

发表评论

表情:
评论列表 (有 0 条评论,495人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jvm监控命令总结

    前言 在生产环境中,为了保证Java应用的健康运行,需要动态检测应用运转过程中的各种指标,比较常见的像CPU利用率,内存使用,堆栈是否正常等 另一方面,生产环境中出现的

    相关 linux系统监控命令

    一、内存监控 监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有free、vmstat、t

    相关 Linux监控命令

    top 命令 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具。Top 命令可以定期

    相关 Linux系统监控命令

    前两天双十一买了个台服务器,折腾了几下之后  才记得要把本地的文件也分享给大家,文档是一年还是两年前就放在自己的文库,今天找出来用的时候记得好像没发出来,这里就贴给大家用了

    相关 Linux命令

    Linux常用命令解析 目录结构 `/usr/bin` 用户后期安装程序后的运行脚本存放地。创建软链接时,需cd到此文件夹。 `/usr/local` 用户级的程