系列文章目录
1:JVM核心知识
1.5:相关性能分析工具
前言
本系列主要针对想进一步进阶Java的开发者,本文介绍JDK内置工具。
一、JVM常见内置命令
java Java 应用的启动程序
javac JDK 内置的编译工具
javap 反编译 class 文件的工具
jps/jinfo 查看 java 进程
jstat 查看 JVM 内部 gc 相关信息
jmap 查看 heap 或类占用空间统计
jstack 查看线程信息
jcmd 执行 JVM 相关分析命令(整合命令)
这些命令默认安装在bin目录下
1.jps -mlv打印各个java进程,包括运行哪个jar包,哪个类。
jps可能查看不全,因为可能多个用户在使用一台机器,jps只能看当前用户的进程,如果想看所有的进程,可以用sudo提升权限。
同时一台机器不同的java进程是用不同的jdk版本run起来的,使用某个版本的jps可能也会导致查看不全的情况,因此最好在一台机器上安装一个确定的jdk
2.jstat -gc 与 jstat -gcutil,主要是用来查看GC相关信息的。
jstat -gc 进程号 1000 1000表示打印指定进程号的信息,每隔1秒打印一次,一共打印1000次
-gcutil是-gc的精简版,-gc显示的是字节数,-gcutil显示的是百分比
3.jmap
-heap用来打印堆内存,与jstat不同的是jmap看的是静态的
-histo查看哪些类占空间最多,能够看到类的实例数与占用的字节总数,我们可以据此来对代码进行优化。
-dump直接生成堆内存的转储文件,可以指定文件格式与文件名
4.jstack可以查看某个java进程所有的线程信息
jstack -l pid l 长列表模式,将线程相关的 locks 信息一起输 出,比如持有的锁,等待的锁
在mac或linux上可以用kill -3 来替代此命令
5.jcmd是对前面命令的综合
jcmd pid VM.version
jcmd pid VM.flags
jcmd pid VM.command_line
jcmd pid VM.system_properties
jcmd pid Thread.print
jcmd pid GC.class_histogram
jcmd pid GC.heap_info
二、JVM图形化工具
1.jconsole
在命令行输入 jconsole 即可打开
本地 JVM 可以直接选择
远程 JVM 可以通过 JMX 方式连接
概览模块有:
堆内存使用量
线程
类
CPU占用率
内存图表包括:
• 堆内存使用量,主要包括老年代(内存池 “PS Old Gen”)、新生代(“PS Eden Space”)、存活区 (“PS Survivor Space”);
• 非堆内存使用量,主要包括内存池“Metaspace”、 “Code Cache”、“Compressed Class Space”等。 可以分别选择对应的 6 个内存池
在这里,我们可以手动执行GC,也可以查看各个内存池使用比率,还可以看JVM执行垃圾回收的次数,以及所消耗的时间。
线程面板:
展示了线程数变化信息,以及监测到 的线程列表。 我们可以常根据名称直接查看线程的状态(运 行还是等待中)和调用栈(正在执行什么操 作)。 特别地,我们还可以直接点击“检测死锁”按 钮来检测死锁,如果没有死锁则会提示“未检 测到死锁”
类监控面板:
可以直接看到 JVM 加载和卸载的 类数量汇总信息,以及随着时间的动态变化
VM 概要:
数据有五个部分: 第一部分是虚拟机的信息; 第二部分是线程数量,以及类加载的汇 总信息; 第三部分是堆内存和 GC 统计; 第四部分是操作系统和宿主机的设备信 息,比如 CPU 数量、物理内存、虚拟 内存等等; 第五部分是 JVM 启动参数和几个关键 路径,这些信息其实跟 jinfo 命令看到 的差不多
总结
以上就是今天要讲的内容,本文介绍了相关性能分析工具,这一章也走向了尾声,下面我们将开始学习GC的背景与一般原理,敬请期待。