1. 是什么
  2. jps
  3.   查看所有的jvm进程,包括进程ID,进程启动的路径等等。
  4.  
  5. jstack
  6.   观察jvm中当前所有线程的运行情况和线程当前状态。
  7. 系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stacknative stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
  8. 系统hung住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stacknative stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
  9.  
  10. jstat
  11.   jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloadercompilergc情况;特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
  12.  
  13. jmap
  14.   监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;
  15. 系统崩溃了?jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等
  16.  
  17. jinfo
  18.   观察进程运行环境参数,包括Java System属性和JVM命令行参数
  19. 系统崩溃了?jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息
  20.  
  21. 用法
  22. jps
  23. jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器。
  24. Jps -ml
  25.  
  26. jstack
  27. -l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
  28. -m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
  29. jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPUJava线程并定位堆栈信息,用到的命令有pstopprintfjstackgrep
  30. . 第一步先找出Java进程ID (ps -ef|grep java |grep springWK color=auto)
  31. .第二步找出该进程内最耗费CPU的线程,可以使用ps -Lfp pid或者ps -mp pid -o THREAD, tid, time或者top -Hp pid,我这里用第三个
  32. TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID21742的线程,用
  33. printf “%x\n
  34. 得到21742的十六进制值为54ee
  35. jstack | grep 54ee
  36.  
  37. jstat
  38. 具体参数如下:
  39. -class:统计class loader行为信息
  40. -compile:统计编译行为信息
  41. -gc:统计jdk gcheap信息
  42. -gccapacity:统计不同的generations(包括新生区,老年区,permanent区)相应的heap容量情况
  43. -gccause:统计gc的情况,(同-gcutil)和引起gc的事件
  44. -printcompilation:不知道干什么的,一直没用过。
  45. 一般比较常用的几个用法:
  46. $ jstat -class (每隔1秒监控一次,一共做10次)
  47. $ jstat -gc (每隔2秒监控一次,共20次)
  48. $ jstat -gcutil (统计gc时,heap情况,按百分比显式)
  49. $ jstat -gccause (统计gc的情况,(同-gcutil)和引起gc的事件,按百分比显式)
  50. $ jstat -compiler (显示VM实时编译的数量等信息)
  51. $ jstat -gccapacity (显示,VM内存中三代(young,old,perm)对象的使用和占用大小)
  52. $ jstat -gcnew (统计gc时,新生代的情况,new对象的信息)
  53. $ jstat -gcnewcapacity (统计gc时,新生代heap容量 ,new对象的信息及其占用量)
  54. $ jstat -gcold (统计gc时,老年区的情况,old对象的信息)
  55. $ jstat -gcoldcapacity (统计gc时,老年区heap容量,old对象的信息及其占用量)
  56. $ jstat -gcpermcapacity (统计gc时,permanentheap容量,perm对象的信息及其占用量)
  57. $ jstat -printcompilation -h3 (当前VM执行的信息,每1000毫秒打印一次,一共打印5次,还可以加上-h3每三行显示一下标题)
  58. 一些术语的中文解释:
  59. S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
  60. S1C:年轻代中第二个survivor(幸存区)的容量 (字节)
  61. S0U:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
  62. S1U:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
  63. EC:年轻代中Eden(伊甸园)的容量 (字节)
  64. EU:年轻代中Eden(伊甸园)目前已使用空间 (字节)
  65. OCOld代的容量 (字节)
  66. OUOld代目前已使用空间 (字节)
  67. PCPerm(持久代)的容量 (字节)
  68. PUPerm(持久代)目前已使用空间 (字节)
  69. YGC:从应用程序启动到采样时年轻代中gc次数
  70. YGCT:从应用程序启动到采样时年轻代中gc所用时间(s)
  71. FGC:从应用程序启动到采样时old代(全gc)gc次数
  72. FGCT:从应用程序启动到采样时old代(全gc)gc所用时间(s)
  73. GCT:从应用程序启动到采样时gc用的总时间(s)
  74. NGCMN:年轻代(young)中初始化(最小)的大小 (字节)
  75. NGCMX:年轻代(young)的最大容量 (字节)
  76. NGC:年轻代(young)中当前的容量 (字节)
  77. OGCMNold代中初始化(最小)的大小 (字节)
  78. OGCMXold代的最大容量 (字节)
  79. OGCold代当前新生成的容量 (字节)
  80. PGCMNperm代中初始化(最小)的大小 (字节)
  81. PGCMXperm代的最大容量 (字节)
  82. PGCperm代当前新生成的容量 (字节)
  83. S0:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
  84. S1:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
  85. E:年轻代中Eden(伊甸园)已使用的占当前容量百分比
  86. Oold代已使用的占当前容量百分比
  87. Pperm代已使用的占当前容量百分比
  88. S0CMX:年轻代中第一个survivor(幸存区)的最大容量 (字节)
  89. S1CMX :年轻代中第二个survivor(幸存区)的最大容量 (字节)
  90. ECMX:年轻代中Eden(伊甸园)的最大容量 (字节)
  91. DSS:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
  92. TT 持有次数限制
  93. MTT 最大持有次数限制
  94.  
  95. jmap
  96. jmap -dump:format=b,file=dump.bin pid jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在SolarisLinuxJDK版本里面才有。
  97. 观察运行中的jvm物理内存的占用情况打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用SHELL jmap -histo pid>a.log可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=String 3024可以将3024进程的内存heap输出出来到String文件里。如果带上live则只统计活对象.
  98. $ jmap -histo:live
  99.  
  100. 还有一个很常用的情况是:用jmap把进程内存使用情况dump到文件中,可以用MATVisualVM等工具查看,这里用jhat查看分析
  101. jmap -dump:format=b,file=/tmp/dump.dat
  102. dump出来的文件可以用MATVisualVM等工具查看,这里用jhat查看
  103. jhat -port /tmp/dump.dat
  104. 然后就可以在浏览器中输入主机地址:9998查看了
  105.  
  106. jinfo
  107. 可以输出并修改运行时的java 进程的opts
  108. 如:
  109. 查看运行时的参数 jinfo -flags
  110. 查看2788MaxPerm大小可以用 jinfo -flag MaxPermSize
  111. 参考范例
  112. JAVA_OPTS="-server -Xms4g -Xmx4g -XX:PermSize=96m -XX:MaxPermSize=256m -Xmn2560m -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX
  113. :CMSMaxAbortablePrecleanTime= -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=
  114.  
  115. jstatd
  116. .启动RMI服务
  117. 在需要被监控的服务器上面,通过jstatd来启动RMI服务
  118. 首先,配置java安全访问,在服务器jdk路径(/java_home/bin)下新建文件
  119. 名称: jstatd.all.policy
  120. 内容:
  121. grant codebase “file:${java.home}/../lib/tools.jar” {
  122. permission java.security.AllPermission;
  123. };
  124. .然后在进入jstatd.all.policy所在目录下,通过如下的命令启动RMI服务:
  125. ./jstatd -J-Djava.security.policy=jstatd.all.policy
  126. 或者
  127. ./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=192.168.22.249
  128.  
  129. jdb
  130.   jdb用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。
  131.  
  132. readOnly mode:
  133. $ jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=
  134.  
  135. debug mode:
  136. server add :
  137. -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xrunjdwp:transport=dt_socket,address=,server=y,suspend=y
  138. client:
  139. $jdb -attach
  140. threads
  141. thread <thread_id>
  142. suspend <thread_id>
  143. step (等待)
  144. kill <thread_id> new java.lang.Exception()
  145.  
  146. $ jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=$JAVA_HOME/bin/java,core=core.
  147. $ jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine1
  148.  
  149. -----------------------------
  150.  
  151. jconsole
  152.   jconsole是基于 (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。
  153. 与jstat相当。jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打 jconsole,选则进程就可以了

jvm分析备忘的更多相关文章

  1. JVM内存知识备忘

    又是一篇备忘... 主要记录一些知识,进行一些资源的汇总. 先来群里liufor大大提供的两张图,清晰易懂: Dockerized Java https://www.youtube.com/watch ...

  2. Nmap备忘单:从探索到漏洞利用(Part 5)

    这是备忘单的最后一部分,在这里主要讲述漏洞评估和渗透测试. 数据库审计 列出数据库名称 nmap -sV --script=mysql-databases 192.168.195.130 上图并没有显 ...

  3. Nmap备忘单:从探索到漏洞利用(Part 2)

    这是我们的第二期NMAP备忘单(第一期在此).基本上,我们将讨论一些高级NMAP扫描的技术,我们将进行一个中间人攻击(MITM).现在,游戏开始了. TCP SYN扫描 SYN扫描是默认的且最流行的扫 ...

  4. SSO之CAS备忘

    http://blog.chinaunix.net/uid-28380443-id-4740103.html 自己负责的公司基于CAS单点登录平台架构已经上线运行,很多细节的东西是时候备忘一下了,开源 ...

  5. Haxe UI框架StablexUI的使用备忘与心得(序)

    最近在手上的项目开发中,从原来的使用Sprite全手写UI,开始逐步使用StablexUI,感觉还是相当不错的,强大.高效.轻量.灵活,非常适应我当前的实际需求. 不过作为小种语言的一个小众第三方开源 ...

  6. 代码备忘, TODO宏实现

    代码备忘, TODO宏实现 我们平时在开发过程中, 往往并非憋足气一股脑敲完所有代码.每一个模块, 每一个函数的实现总有个先后顺序. 又或者哪个部分须要做调整, 改动- 所以, 我们须要有一个东西, ...

  7. sqlserver -- 学习笔记(一)自定义函数(学习总结,备忘)

    SQL Server自定义函数,以前只在书上看过,没有动手去敲一敲,今天刚好接触到,看了几篇博文学习了下.做好备忘很重要!! (@_@)Y Learn from:http://www.cnblogs. ...

  8. Mysql又一次整理笔记--woods备忘

    ==============================SQL备忘 CRUD 查询 多表 事件等=============================== ------------------ ...

  9. Poj 3356 ACGT(LCS 或 带备忘的递归)

    题意:把一个字符串通过增.删.改三种操作变成另外一个字符串,求最少的操作数. 分析: 可以用LCS求出最大公共子序列,再把两个串中更长的那一串中不是公共子序列的部分删除. 分析可知两个字符串的距离肯定 ...

随机推荐

  1. [BZOJ5028]小Z的加油店

    [BZOJ5028]小Z的加油店 题目大意: 一个长度为\(n(n\le10^5)\)的数列,\(m(m\le10^5)\)次操作,支持区间加和区间\(\gcd\). 思路: 线段树维护差分,\(\g ...

  2. SpringBoot 部署 docker 打包镜像

    SpringBoot 部署 docker 打包镜像 环境: 1.代码编写工具:IDEA 2.打包:maven 3.docker 4.linux 7.JDK1.8 8.Xshell 9.Xftp 第一步 ...

  3. bzoj 3172

    收获:AC自动机定数组大小时,如果不确定,就定10^6(极限了) /************************************************************** Pro ...

  4. c# -- 解决FromsAuthentication上下文不存在

    使用 FormsAuthentication.HashPasswordForStoringInConfigFile("需要加密的字符串", "MD5")这个方法 ...

  5. [转]String.Replace 和 String.ReplaceAll 的区别

    JAVA 中的 replace replaceAll 问题: 测试code System.out.println("1234567890abcdef -----> "+&qu ...

  6. CAShapeLayer实现音量大小动态改变

    我是效果图 实现如图这效果一般会直接通过多张图进行切换进行完成.但这样的处理,会浪费App的资源存储空间,而且效率也不高.那么今天我们用CAShapeLayer实现以下吧. 拆分: 1.一个椭圆 2. ...

  7. Android/Java 中的 String, StringBuffer, StringBuilder的区别和使用

    Android 中的 String, StringBuffer 和 StringBuilder 是移动手机开发中经常使用到的字符串类.做为基础知识是必须要理解的,这里做一些总结. A.区别 可以从以下 ...

  8. C# dataGridView根据数据调整列宽

    //自适应列宽 this.dgvBaoming.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.A ...

  9. (转)H264通过RTMP发布 V2.0 (Red5 Wowza 测试通过)

    直接上代码 // demo.cpp : 定义控制台应用程序的入口点.//#include "stdafx.h"#includeextern "C"{#inclu ...

  10. Windows 配置 Apache Python CGI

    提示:安装Apache可参考 https://jingyan.baidu.com/article/0eb457e53c019f03f1a905c7.html 1.  打开URL: https://ww ...