学习笔记-JVM-工具包(JVM分析工具)

常用工具

JDK工具

① jps: JVM Process status tool:JVM进程状态工具,查看进程基本信息
② jstat: JVM statistics monitoring tool : JVM统计监控工具,查看堆,GC详细信息
③ jinfo:Java Configuration Info :查看配置参数信息,支持部分参数运行时修改
④ jmap:Java Memory Map :分析堆内存工具,dump堆内存快照
⑤ jhat:Java Heap Analysis Tool :堆内存dump文件解析工具
⑥ jstack:Java Stack Trace :Java堆栈跟踪工具
⑦ VisualVM:性能分析可视化工具
注:前面6个为命令行,最后一个为性能分析可视化工具(不能在linux中使用)

第三方工具

① GCEasy:免费GC日志可视化分析Web工具
② MAT:Memory Analyzer Tool 可视化内存分析工具
③ GCViewer:开源的GC日志分析工具
④ Arthas:线上Java程序诊断工具,功能非常强大

JDK工具使用案例
  1. JPS
#列出Java程序进程ID和Main函数名称
jps 

#只输出进程ID
jps -q 

#输出传递给Java进程(主函数)的参数 例如--spring.config.location
jps -m 

#输出主函数的完整路径
jps -l 
#显示传递给Java虚拟的参数
jps -v 
  1. jstat

options:由以下值构成
-class:显示ClassLoader的相关信息
-compiler:显示JIT编译的相关信息
-gc:显示与GC相关信息
-gccapacity:显示各个代的容量和使用情况
-gccause:显示垃圾收集相关信息(同-gcutil),同时显示最后一次或当前正在发生的垃圾收集的诱发原因
-gcnew:显示新生代信息
-gcnewcapacity:显示新生代大小和使用情况
-gcold:显示老年代信息
-gcoldcapacity:显示老年代大小
-gcpermcapacity:显示永久代大小
-gcutil:显示垃圾收集信息

#进程id 采样间隔250ms 采样数4
jstat -gc 30108 250 4

在这里插入图片描述

S0C:年轻代中第一个survivor(幸存区)的容量 (单位kb)
S1C:年轻代中第二个survivor(幸存区)的容量 (单位kb)
S0U :年轻代中第一个survivor(幸存区)目前已使用空间 (单位kb)
S1U :年轻代中第二个survivor(幸存区)目前已使用空间 (单位kb)
EC :年轻代中Eden的容量 (单位kb)
EU :年轻代中Eden目前已使用空间 (单位kb)
OC :Old代的容量 (单位kb)
OU :Old代目前已使用空间 (单位kb)
MC:metaspace的容量 (单位kb)
MU:metaspace目前已使用空间 (单位kb)
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGC :从应用程序启动到采样时年轻代中gc次数
YGCT :从应用程序启动到采样时年轻代中gc所用时间(s)
FGC :从应用程序启动到采样时old代(全gc)gc次数
FGCT :从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT:从应用程序启动到采样时gc用的总时间(s)

#进程ID 26856 采样间隔1s 采样数5
jstat -gcutil 26856 1s 5

在这里插入图片描述
S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
O old代已使用的占当前容量百分比
M metaspace已使用的占当前容量百分比
CCS 压缩使用比例
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)

  1. jinfo
    -flags 打印虚拟机 VM 参数
    -flag 打印指定虚拟机 VM 参数
    -flag [+|-] 打开或关闭虚拟机参数
    -flag = 设置指定虚拟机参数的值
#参数选项 进程id
jinfo -flags 26856

在这里插入图片描述

  1. Jmap
    用来查看堆内存的使用情况,一般结合jhat使用。
jmap 26856 #进程号

查看进程的内存映像信息。使用不带选项参数的jmap打印共享对象映射,将会打印目标虚拟机中加载的每个共享对象的
起始地址、映射大小以及共享对象文件的路径全称。
在这里插入图片描述

#显示Java堆详细信息:打印堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
jmap -heap 26856 

在这里插入图片描述

jmap -histo:live 26856 

显示堆中对象的统计信息:其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果ja指定了live子选项,则只计算活动的对象。
在这里插入图片描述
[C字符数组,[B byte类型的数组, [I 整型, [Ljava.lang.Object 对象数组

jmap -clstats 26856

打印类加载器信息:打印Java堆内存的方法区的类加载器的智能统计信息。对于每个类加载器而言,它的名称、活跃度、
地址、父类加载器、它所加载的类的数量和大小都会被打印。此外,包含的字符串数量和大小也会被打印。
在这里插入图片描述

jmap -finalizerinfo 26856 #打印等待终结的对象信息
jmap -dump:format=b,file=heapdump.hprof 26856 

生成堆转储快照dump文件:以二进制格式转储Java堆到指定文件中。如果指定了live子选项,堆中只有活动的对象会被转
储。浏览heap dump 可以使用jhat 读取生成的文件,也可以使用MAT等堆内存分析工具。
注意:这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用, 线上系统慎用!
5. Jhat :Java Heap Analysis Tool
jhat 命令会解析Java堆转储文件,并启动一个 web server。然后用浏览器来查看/浏览 dump 出来的 heap二进制文件。
jhat 命令支持预先设计的查询,比如:显示某个类的所有实例。还支持 对象查询语言(OQL)。 OQL有点类似SQL,专门用来查询堆转储。
Java生成堆转储的方式有多种:

  • 使用 jmap -dump 选项可以在JVM运行时获取 dump.

  • 使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储,通过VisualVM来dump。
    在这里插入图片描述

  • 在虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项,则抛出 OutOfMemoryError 时,会自动执行堆转储。

jhat [ options ] heap-dump-file
#通过Jmap dump
jmap -dump:format=b,file=demo.hprof 26856 
#可以启动一个服务端口是7000 查看堆的信息
jhat ./demo.hprof 

通过jhat 可以生成一个服务,然后打开这个端口可以看到相关的信息,是一个网页:
在这里插入图片描述

jhat 启动后显示的 html 页面中包含有:
All classes including platform:显示出堆中所包含的所有的类
Show all members of the rootset :从根集能引用到的对象
Show instance counts for all classes (including platform/excluding platform):显示平台包括的所有类的实例数量
Show heap histogram:堆实例的分布表
Show finalizer summary:Finalizer 摘要
Execute Object Query Language (OQL) query:执行对象查询语句(OQL)

  1. jstack:Java Stack Trace
    jstack是Java虚拟机自带的一种堆栈跟踪工具,用于生成java虚拟机当前时刻的线程快照。
    线程快照是当前Java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待、等等。
    线程快照里留意下面几种状态
    死锁,Deadlock(重点关注)
    等待资源,Waiting on condition(重点关注)
    等待获取管程,Waiting on monitor entry(重点关注)
    阻塞,Blocked(重点关注)
    执行中,Runnable
    暂停,Suspended
    对象等待中,Object.wait() 或 TIMED_WAITING
    停止,Parked
jstack [ option ] pid #查看当前时间点,指定进程的dump堆栈信息。
jstack [ option ] pid > #文件 将当前时间点的指定进程的dump堆栈信息,写入到指定文件中。
# 注:若该文件不存在,则会自动生成; 若该文件存在,则会覆盖源文件。
jstack [ option ] executable core# 查看当前时间点,core文件的dump堆栈信息。
jstack [ option ] [server_id@]<remote server IP or hostname> #查看当前时间点,远程机器的dump堆栈信息。

-F 当进程挂起了,此时’jstack [-l] pid’是没有相应的,这时候可使用此参数来强制打印堆栈信息,强制jstack),一般情况不
需要使用。
-m 打印java和native c/c++框架的所有栈信息。可以打印JVM的堆栈,以及Native的栈帧,一般应用排查不需要使用。
-l 长列表. 打印关于锁的附加信息。例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用。
-h or -hel 打印帮助信息

jstack 26856 #打印堆栈
jstack -l 26856 | grep 'java.lang.Thread.State' | wc -l 统计线程数量

在这里插入图片描述

  1. VisualVM
    VisualVM 是一款免费的性能分析工具。它通过 jvmstat、JMX、SA(Serviceability Agent)以及 Attach API 等多种方式从程序运行时获得实时数据,从而进行动态的性能分析。同时,它能自动选择更快更轻量级的技术尽量减少性能分析对应用程序造成的影响,提高性能分析的精度。
    远程可视化监控JVM
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=172.26.233.198
-Dcom.sun.management.jmxremote.rmi.port=9999
#JAVA_OPT="${JAVA_OPT} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -
Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -
Djava.rmi.server.hostname=123.56.254.18 -Dcom.sun.management.jmxremote.rmi.port=9999"

需要互联需要在同一网段才能使用,需要保证能够相互通信,连公网ip是不可以的。
在这里插入图片描述

第三方工具使用案例
  1. GCEasy
    业界首先采用机器学习算法解决GC日志分析问题,GCeasy内置机器智能可以自动检测JVM和Android GC日志中的问题,并推荐解决方案。
    https://gceasy.io/
    GC日志分析是免费的,Machine Learning收费,它的使用只需要在网站上上传一个gc日志。
    特点:
    几秒内解决GC和内存问题
    提供JVM堆优化建议
    基于机器学习
    在这里插入图片描述

在这里插入图片描述
2. MAT
1)介绍
MAT是一个强大的可视化内存分析工具,可以快捷、有效地帮助我们找到内存泄露,减少内存消耗分析工具。MAT是Memory Analyzer tool的缩写,是一种快速,功能丰富的Java堆分析工具,能帮助你查找内存泄漏和减少内存消耗。
功能:
找到最大的对象,因为MAT提供显示合理的累积大小(retained size)
探索对象图,包括inbound和outbound引用,即引用此对象的和此对象引出的
查找无法回收的对象,可以计算从垃圾收集器根到相关对象的路径
找到内存浪费,比如冗余的String对象,空集合对象。
MAT下载地址
注意需要下载支持JDK的版本:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MAT相关概念说明
1 内存泄漏与内存溢出
内存泄露:对象是垃圾了,还存在被GCRoots引用的情况,无法被垃圾收集器回收。
解决方案:找出泄漏的代码位置和原因,具体问题具体解决;
内存溢出:内存中的对象非常多,堆空间不足,就会出现。
解决方案:检查堆大小设置是否合理,检查是否存在对象生命周期太长、持有状态时间过长的情况。
2 shallow heap及retained heap
shallow heap:对象本身占用内存的大小,也就是对象内存区域的总和。
retained heap:对象及对象引用链中所有对象的大小总和,如果一个对象被释放掉,因为该对象的释放而被释放的所有的对象的大小。相对于shallow heap,Retained heap可以更精确的反映一个对象实际占用的大小。
3 outgoing references与incoming references
outgoing references :表示该对象的出节点(被该对象引用的对象)。
incoming references :表示该对象的入节点(引用到该对象的对象)。
3 Dominator Tree
Dominator Tree对象的支配树:帮助我们快速的发现占用内存最大的块,也能帮我们分析对象之间的依赖关系。
在这里插入图片描述
分析GC
在这里插入图片描述

MAT工具使用
分析内存溢出
分析内存泄露
查看对象个数及对象内存占用
观察对象回收后释放空间大小
观察线程栈

  1. GCViewer
    GCViewer是一款开源的GC日志分析工具。项目的 GitHub 主页对各个指标提供了完整的描述信息 需要安装JDK才能使用。借助GCViewer日志分析工具,可以非常直观地分析出待调优点。
    可从以下几方面来分析:
    Memory:分析Totalheap、Tenuredheap、Youngheap内存占用率及其他指标,理论上内存占用率越小越好;
    Pause:分析Gc pause、Fullgc pause、Total pause三个大项中各指标,理论上GC次数越少越好,GC时长越小越好;
    下载地址GCeasy的替代品
 #分析gc日志,打开图形化界面
java -jar gcviewer-1.36.jar gc.log
# 分析gc日志,不打卡图形化界面,将结果直接生成
java -jar gcviewer-1.36.jar gc.log summary.csv chart.png
  1. Arthas
    Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
    可以做什么?
    当你遇到以下类似问题而束手无策时, Arthas 可以帮助你解决:
    1 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
    2 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
    3 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
    4 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
    5 是否有一个全局视角来查看系统的运行状况?
    6 有什么办法可以监控到 JVM 的实时运行状态?
    7 怎么快速定位应用的热点,生成火焰图?
    Arthas 支持 JDK 6+,支持 Linux、Mac、Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。
# 下载arthas-boot.jar
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
# 打印帮助信息:
java -jar arthas-boot.jar -h
# 启动
java -jar arthas-boot.jar

Arthas 常见命令
官方文档
jvm:查看当前 JVM 的信息
thread:查看当前 JVM 的线程堆栈信息,
-b 选项可以一键检测死锁
-n 指定最忙的前N个线程并打印堆栈
-1 打印统计信息(数字1)
trace:方法内部调用路径,并输出方法路径上的每个节点上耗时,服务间调用时间过长时使用
stack:输出当前方法被调用的调用路径
Jad:反编译指定已加载类的源码,反编译便于理解业务
logger:查看和修改 logger,可以动态更新日志级别
支持管道:
Arthas支持使用管道对上述命令的结果进行进一步的处理,如 sm java.lang.String * | grep ‘index’
grep——搜索满足条件的结果
plaintext——将命令的结果去除ANSI颜色
wc——按行统计输出结果
后台异步任务:
当线上出现偶发的问题,比如需要watch某个条件,而这个条件一天可能才会出现一次时,异步后台任务就派上用场了,

  • 使用 > 将结果重写向到日志文件,使用 & 指定命令是后台运行,session断开不影响任务执行(生命周期默认为1天)
  • jobs——列出所有job
  • kill——强制终止任务
  • fg——将暂停的任务拉到前台执行
  • bg——将暂停的任务放到后台执行
    用户数据回报:
    在 3.1.4 版本后,增加了用户数据回报功能,方便统一做安全或者历史数据统计。
    在启动时,指定 stat-url ,就会回报执行的每一行命令,比如: ./as.sh --stat-url ‘http://192.168.10.11:8080/api/stat’
    也就是说没执行一条命令我们可以进行监控,比如我们自己写一个服务,然后接受命令执行。

使用
在这里插入图片描述

dashboard

在这里插入图片描述

thread -1 #会打印线程统计信息 这里是数字1

在这里插入图片描述

jap com.learn.lessonone.DemoController #反编译源码

在这里插入图片描述

#监控接口 controller getData是方法名,注意是方法名不是路径
watch com.learn.lessonone.DemoController  getData returnObj

在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
第一章 1.Java 编程语言刚开始 Oak 橡树 办公室外 已被注册 边喝咖啡边讨论名称 2.动态加载类别文档、字符串池(String Pool)等特性为节省内存而设计 3.jdk java development kit java 开发工具集 java se 平台包括jdk与java语言 ,(不知道编程语言是什么?可以这样想 :java 语言 ->类文件(字节码文件)->汇编语言->二进制码) 4.大多数java标准版本平台都会取个代码名称(code name),如Java SE 7 dolphin(海豚) 5.从大到小,包含与被包含:java se:java 语言、jdk(jre(jvm,java se api))。jdk包含了java程序语言、工具程序与jre,jre包括了部署技术、java se api与jvm。 6. 7.Web容器是Servlet/JSP唯一认识的HTTP服务器,是使用Java撰写的应用程序,运行于JVM之上。 8.JVM让Java可以跨平台,不同的系统平台有不同的JVM,它们都认识.class文件。Java编译语言将Java代码编译成.class文件(只有一种形式),而C/C++语言将代码编译成01码,不同的操作系统的01码指令不同,这造成了不能跨平台,而Java将这个任务交给JVM,不同操作系统上的JVM将.class文件编译成不同的二进制码。 9.java se development 8uN ,其中N是JDK更新版本号。 10.java安装时要理解这三个东西,安装是否成功输入java 命令测试一下工具是否可用。 11.java安装目录详解https://zhidao.baidu.com/question/181908777.html 12.习题http://blog.csdn.net/u012965373/article/category/1779777 13.第一个Hello World 使用b语言(c语言的前身)写的 第二章 1.java程序中的空格只能是半角空格符或者tab空格符 2.一个.java文档可定义多个类,但是只能有一个公开类,而且主文档名必须与公开类名相同。 3. 4.echo %path% 是系统环境变量附加用户变量,set path="路径” %path%>系统变量>用户变量,只有通过“高级系统设置”方式则可以长久保存。 5.java指令的目的是启动jvm,然后执行指定的执行文件(.class)。windows系统的可执行文件是.exe和.bat ,Linux系统的可执行文件是有执行权限的文档。 6.java -cp/-classpath .;C:\workspace;C:\lib\abc.jar 指定jvm寻找.class文件路径的方法有三种,分别是从当前目录下寻找、某个文件夹下寻找或在链接库的jar文件中寻找。 同样,使用命令行指定classpath的方式优先于从系统读取classpath环境变量。 7.jar文档(java archive)采用的是zip格式压缩。 8. 也就是说执行javac命令时会执行到java命令。javac需要某个路径来编译当前文件,也就是那个java命令需要。所以javac和java都需要指定好所依赖的路径。
JVM调优工具命令详解》是一份预习资料,主要介绍了Java虚拟机(JVM)调优过程中使用的一些工具命令。这些工具命令可以帮助开发人员诊断和优化JVM的性能问题。 文中首先介绍了常用的JVM调优工具命令,包括jps、jstat、jinfo、jmap、jhat等。这些命令可以用于查看JVM进程信息、统计JVM内存和线程情况、获取JVM配置参数等。通过使用这些工具命令,开发人员可以快速定位JVM性能瓶颈所在,进行优化。 接下来,文中详细介绍了每个工具命令的使用方法和参数解释。例如,jstat命令可以用于查看JVM内存情况,包括堆内存使用量、垃圾回收情况等。而jmap命令可以用于生成堆内存转储文件,帮助开发人员分析内存泄漏问题。通过掌握这些工具命令的使用,开发人员可以更加高效地进行JVM调优。 此外,文中还介绍了一些实际的调优案例,通过使用这些工具命令来解决实际的JVM性能问题。这些案例包括内存泄漏、线程死锁、CPU占用过高等问题。通过学习这些案例,开发人员可以更好地理解如何利用工具命令来诊断和解决JVM性能问题。 总的来说,《JVM调优工具命令详解》是一份非常实用的预习资料,适合那些需要深入学习JVM性能优化的开发人员。通过学习和掌握这些工具命令,开发人员能够更加高效地进行JVM调优,提升应用程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值