目录
1. 相关命令
1.1 jps
- jps #简单列出当前正在运行的虚拟机进程
- jps -l #列出进程,并输出类全名或jar包路径
- jps -v #列出进程,输出虚拟机启动是的JVM参数
1.2 Jmap
常用的是 -heap 查看堆信息,-histo当前堆内对象明细,-dump导出堆dump文件
- jmap -heap 22796 #查看堆的总体信息,各个区域占用情况及配置信息
- jmap -histo 14660 #查看历史生成的实例
- jmap -histo:live 14660 #查看当前存活的实例,执行过程中会触发一次full gc
- jmap -histo 14660 > d:/log.txt 输出到文件
- jmap -dump:live,format=b,file=D:/test.dump 37056 #导出dump,只要存活的对象,可用jvisualvm分析dump对象
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\jvm.dump
内存溢出时自动导出dump文件到指定路径
1.3 Jstack
生成java虚拟机当前时刻的线程快照
可以用来检测程序死锁,编写一死锁程序
public static void main(String[] args) throws InterruptedException, IOException {
final Object obj1 = new Object();
final Object obj2 = new Object();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj1) {
try {
// 睡一会保证死锁发生
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {}
System.out.println("11111");
synchronized (obj2) {
System.out.println("22222");
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj2) {
try {
// 睡一会保证死锁发生
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {}
System.out.println("333333");
synchronized (obj1) {
System.out.println("44444");
}
}
}
}).start();
执行程序,成功锁住
1.4 Jinfo
主要用来查看jvm的各项参数,示例:
- jinfo -flags pid #打印虚拟机参数
- jinfo -flag 参数名 pid #查看某个参数是否启用
查看当前是否启用了G1收集器
1.5 Jstat
查看堆内存各部分的使用量,以及加载类的数量
jstat [-命令选项] [vmid] [间隔时间(毫秒)] [查询次数]
- jstat -gc pid 最常用,示例:jstat -gc 29688 2000 #查看pid29688的进程垃圾回收情况,2秒刷新一次
- S0C:第一个幸存区的大小,单位KB
- S1C:第二个幸存区的大小
- S0U:第一个幸存区的使用大小
- S1U:第二个幸存区的使用大小
- EC:伊甸园区的大小
- EU:伊甸园区的使用大小
- OC:老年代大小
- OU:老年代使用大小
- MC:方法区大小(元空间)
- MU:方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC:年轻代垃圾回收次数
- YGCT:年轻代垃圾回收消耗时间,单位s
- FGC:老年代垃圾回收次数
- FGCT:老年代垃圾回收消耗时间,单位s
- GCT:垃圾回收消耗总时间,单位s
还有其他选项,更有针对性的查看JVM情况,-class查看加载的class数量等,-gccapacity查看堆内存使用情况等。
通过查看内存垃圾回收频率和对象增长速率,调整堆大小,年轻代和老年代大小比例等来减少full GC次数。尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年 代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。
2. jvisualvm
JDK自带的分析工具,目录:$JAVA_HOME/bin下jvisualvm.exe
打开后界面如下,选择要监控的程序进程,能看到jvm参数、线程执行情况、CPU和堆内存使用情况等,如果需要查看运行时堆gc情况需要另外安装插件
划圈的是可以查看当前堆中的类的情况实例多少,占用内存多少等,亦可以导入dump文件分析
2.1 安装GC监控插件:Visual GC
安装步骤:
1、打开jvisualvm,工具--》插件--》可用插件,勾选Visual GC安装,若安装失 败,走2
2、进入visual VM官网 https://visualvm.github.io/pluginscenters.html
查找对应jdk版本的vm工具下载路径例如JDK7Update 6-25:https://visualvm.github.io/archive/uc/7u6/updates.xml.gz,复制到jvisualvm 工具--》插件--》设置
然后再打开可用插件,勾选Visual GC安装,若还是安装失败,走3
3、打开2中下载路径
下载Visual GC到本地,打开插件--》已下载,导入安装
2.2 监控远程linux服务器java应用
两步
一:打开远程linux服务器上的jstatd , jstatd用来监控jvm创建终止,并提供接口给外部监控工具
二:本地jvisualvm配置远程监控地址和端口
第一步:cd $JAVA_HOME/bin,进入jstatd工具目录,直接执行会报错,需要赋予权限
新建个jstatd.all.policy权限文件,在哪建都行,一般权限文件都在$JAVA_HOME/jre/lib/security/下,咱也建到这
vim jstatd.all.policy 输入下方代码,简单设置直接赋予所有权限
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
之后再到$JAVA_HOME/bin目录下启动jstatd
./jstatd -J-Djava.security.policy=../jre/lib/security/jstatd.all.policy &
默认开启的监听端口为1099,可以加-p参数指定端口
./jstatd -J-Djava.security.policy=../jre/lib/security/jstatd.all.policy -p 9866 &
第二步:jvisualvm左边栏右键添加远程主机,配置服务器地址和第一步配置的端口,默认1099,配置好后若连接正常,主机下会出现远程服务器中监控到的jvm
2.3 Visual GC界面初识
Refresh rate设置刷新图表频率,从左向右看
Space
- Perm 监控的应用是JDK6的,所以是perm,1.8后就是metaspace
- Old 老年代
- Eden 年轻代的伊甸园区
- S0/S1 两个surviver区
Graphs
- Compile Time 编译时间,总编译数3550,累计时间29.582s,一次突起表示一次JIT编译
- Class Loader Time 类加载事件,总加载类18702个,101个卸载,花费时间1m 28.985s
- GC Time 垃圾回收次数992次,花费1m 12.348s, 最后一次gc原因不知,突起表示正在gc
- Eden Space 伊甸园区,最大容量1023.875M,当前容量210.821M,已经使用了113M,垃圾回收949次,耗费时间19s
- Surviver 0区 最大容量341M,当前容量61M,已使用0
- Surviver 1区 最大341M,当前63M,已使用1M
- Old Gen 老年代 最大1G,当前682M,已使用348M,垃圾回收43次,耗费52s
- Perm Gen 永久代 最大512M,当前256M,已使用169M
3. BTrace
原理类似我在类加载系统笔记中测试的HotSwap热加载示例,利用了java 1.6之后的VirtaulMachine技术,动态的attach到一个已启动的jvm上,为他去启动一个BtraceAgent,为我们在目标jvm上植入的btrace agent实现。主要是Instrumentation技术, asm字节码处理技术。帮助我们在不重启应用情况下,增加日志,获取应用的一切调用信息。
可以单独命令行使用,我用的是Jvisualvm插件BTrace
安装:https://visualvm.github.io/uc/8u131/updates.html 下载Btrace相关,打开jvisualvm导入插件即可,安装完成,右键进程--》trace application --》如下
需要我们编写脚本来实现各种功能,官网上https://github.com/btraceio/btrace/tree/develop/btrace-dist/src/main/resources/samples有些许示例,可以学习参考,这里我只列出我测试过的,觉得很有用的一些示例。
测试代码是一个简单的rest请求
- 输出调用堆栈
- 方法打印入参和返回值
有缓冲区延迟所以加上println("=================================");一行
还可以打印方法耗时、定时执行任务、监控程序是否走到某某行代码等等,待研究
4. Arthas
是阿里巴巴开源的 Java 诊断工具,待研究
JVM笔记(四)Arthas使用