这是一个使用jvm调优工具的综合例子。
对于面试,总结步骤如下:
- 通过jps命令找进程id
- 找到进程id通过top -Hp 命令找占用过高的线程id,并转为16进制
- 使用jstack导出快照信息,并根据刚才16进制数定位有问题的代码位置。
在Java面试过程中可以通过这个步骤应对面试官,当然您需要结合自身的项目经验来回答。下面是具体的实操过程。
1)写一个死循环的测试代码示例
public class HelloWorld extends Thread{
public HelloWorld() {
}
public HelloWorld(String name) {
super(name);
}
public static void main(String args[]) {
HelloWorld helloWorld = new HelloWorld("yxjc123_com");
helloWorld.start();
}
@Override
public void run() {
while(true)
{
System.out.println("jstack 死循环测试");
}
}
}
2)打包成jar文件上传到linux服务器并运行
java -jar test.jar
3)使用jps命令获取当前的进程id号
jps -l
输出 29376 test.jar
进程号是29376
4)使用 top -Hp pid命令获取到当前进程的所有线程,并找出占用cpu最大的线程id
top -Hp 29376
我们看到线程id为29388占用的cpu最大。
5) windows+R输入calc 打开计算器,选择程序员模式,将29388转为16进制,因为线程快照中线程id使用16进制来表示的。
6)使用jstack命令导出线程快照信息。
jstack -l 29376 > /data/jstack_29376.txt
7) 使用记事本或者相关编辑器打开这个快照文件搜索刚才转换的16进制 72CC
这样通过一系列操作找到了cpu占用过高的代码位置。