GC 调优基础知识之工具篇
在实际的项目中GC存在很多的问题,例如高延时,高内存占用等这里结合之前的垃圾回收理论+工具去排除问题,解决实际生产问题,优化代码和运行参数。
jps
jps 常用的Java运行线程查看工具,查看当前运行的Java线程,确认目标项目是否部署成功等。比较常用的参数是-l 和 -v 一般在生产上如果有太多的程序在跑以查看路径。
- jps -l 查看主类完整的package 名称和jar完整名称
- jps -v 查看Java运行参数和具体路径
jstat
jstat 是查看GC的参数,一般用于排查服务的性能问题,可以看到上一次的GC发生的原因,是新生代还是老年代的空间满了,哪里频繁STW而导致了服务性能的下降。一般在生产环境的Linux是定位的首要工具。比较常用和重要的参数有:
- -gccause (最近一次GC统计和原因)
- -gcutil (GC统计汇总)
- -gc (GC 堆状态)
还有各种查看不同空间的大小。
我们试着写一段代码,写一个线程不断地往list中添加元素,等到新生代满了,就会触发youngGC,通过刷新两次的jstat就可以看到新生代空间的大小发生了变化。
@Override
public void run() {
try {
while(true){
if(list.size()*512/1024/1024>=990){
list.clear();
System.out.println("list is clear");
}
byte[] bl;
for(int i=0;i<100;i++){
bl = new byte[512];
list.add(bl);
}
Thread.sleep(1);
}
} catch (Exception e) {
}
}
}
jinfo
查看和修改虚拟机的参数
- jinfo –sysprops 可以查看由 System.getProperties()取得的参数
- jinfo -flag 可以添加参数
例如往使用命令 jinfo -flag +PrintGC,用来打印GC的参数,而且这个命令不需要重启虚拟机,这也是排查的一个重要方法。
Arthas
这是阿里巴巴封装好的一个查看命令进程的工具,它提供了一系列的封装好的工具用于排查JVM运行中的问题。
常用命令Dashboard
一般5s刷新一次,可以监控内存的回收情况和相关线程。
常用命令Thread
这个命令跟jstack相似,也是可以用来排查死锁。根据不同的参数可以查看线程的不同情况,例如加 -n,查看最忙的几条线程,加-b 查看阻塞的线程。
常用命令jad
反编译已加载类的代码,常用于生产上查看是否部署。
常用命令trace
trace 用来检测一个方法的执行时间,例如下面本地项目跑的一个方法可以看到这个方法里面调用了其他什么方法,并且返回的时间有多长,例如下面有一个数据库查询的就占用了时间。
monitor 每5秒检查一次
动态追踪底层实现
看了上面的arthas 看出来动态追踪技术是不用停止项目的进行追踪,但是它有点像spring的AOP功能。它是基于Java Attach API实现的。然后我觉得好像没啥卵用,,就不学了吧。。。哈哈