这是一个使用jvm调优工具的综合例子。

对于面试,总结步骤如下:

  1. 通过jps命令找进程id
  2. 找到进程id通过top -Hp 命令找占用过高的线程id,并转为16进制
  3. 使用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

java线程死循环测试效果图

3)使用jps命令获取当前的进程id号

jps -l 
输出
29376 test.jar

 进程号是29376

4)使用 top -Hp pid命令获取到当前进程的所有线程,并找出占用cpu最大的线程id

top -Hp 29376

top -Hp pid命令

我们看到线程id为29388占用的cpu最大。

5) windows+R输入calc 打开计算器,选择程序员模式,将29388转为16进制,因为线程快照中线程id使用16进制来表示的。

JVM调优工具jstack命令

6)使用jstack命令导出线程快照信息。

jstack -l 29376 > /data/jstack_29376.txt
7) 使用记事本或者相关编辑器打开这个快照文件搜索刚才转换的16进制 72CC

JVM调优工具jstack命令

这样通过一系列操作找到了cpu占用过高的代码位置。