Java性能监控与调优(一)
基于JDK命令行工具的监控
XX参数
非标准化参数,一般用于JVM调优和调试
与此类似:
-Xss等价于-XX:ThreadStackSize
查看JVM运行时参数
jps(查看java进程的pid)
jinfo(查看java进程的信息)
jstat查看JVM统计信息类加载 -class
垃圾收集 -gc
JIT编译 -compiler
1000和10表示每间隔1000ms输出一次,共十次
导出内存映像文件
我们先制造一个会发生内存溢出的场景:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22@RestController
public class DemoController{
private List userList = new ArrayList<>();
@Resource
private TestService testService;
/***
* -Xmx32M -Xms32M
* @return
*/
@GetMapping("/heap")
public String heap(){
int i = 0;
while(true) {
userList.add(new User(i++, UUID.randomUUID().toString()));
}
}
}
为了方便,我们可以对Xmx和Xms进行设置,这样很快就发生内存溢出。
导出了内存映像文件之后可以使用mat来查看,这是一个eclipse的内存分析程序。
此处的shallow heap指的是该对象本身占用的内存(不包含它的成员)
还可以查看特定对象的引用链
真的是一个非常强大的工具。
jstack(查看线程的栈,检查死锁)
先复习一下线程的状态转换
其中nid表示十六进制的pid
那么如何定位线上的问题呢?
一般的思路是:
先通过top命令找到cpu占用率较高的java进程,找到其pid(或者直接通过ps命令找到)
再利用top命令查看线程(具体的参数平台相关)(top -H -p [pid]),找到线程pid
利用jstack输出栈轨迹,通过线程pid定位到具体线程
jvisualvm(可视化分析工具)
到java的bin目录下即可找到jvisualvm
实际上就是一个命令行工具的图形化集成,不过更加的直观易用,也比较的方便。
该工具还可以分析远程的Java进程,具体通过JMX参数设置,此处不赘述。
btrace
一种更为强大的工具,可以动态地往Java进程织入字节码,
对任意方法的调用(入参,返回等)以及异常等进行拦截。
由于实用性不算太强,故此处不再赘述,仅告知存在。