今天一个电话面试问了这个问题。回来查了下答案,本身也顺带操做一遍,作个记录。以前只知道jstack工具能够查看线程状态这些。好比死锁这些,主要是以前不知道top -H -p pid这个命令的使用,这命令能够看到进程下面线程信息,拿到线程ID,而后再结合jstack命令使用就能够解决这个问题了。下面记录一下具体的操做步骤:java
1.打个jar包丢到机器上运行面试
package com.nijunyang.test; public class TestApplication { public static void main(String[] args) { for (int i = 0; i < 50; i++) { new Thread(()->test()).start(); } } public static void test() { while (true) { int a = 1 + 6; System.out.println(a); } } }
使用这个maven插件 打包jarapache
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <configuration> <archive> <manifest> <mainClass>com.nijunyang.test.TestApplication</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
2. java -jar test-0.0.1-SNAPSHOT-jar-with-dependencies.jar 运行程序maven
一直在输出工具
3.top |grep java 或者 jps指令找到java进程的pid(6167)spa
4. top -H -p pid 以线程的形式查看该进程 top -H -p 6167插件
由于咱们程序是起了50个线程 因此这里就会展现这个进程中的全部线程呢线程
5.前面的线程ID是10进制的,,须要转换成16进制,,由于等下在jstack命令取出来的线程ID是16进制的:这里就随便选一个线程ID 去转换了,真实环境确定是选择CPU占用率最高的那个线程,echo "obase=16;6219" | bccode
6.jstack 6167 >threadInfo.txt 信息输出到文件 而后查看。也能够直接在命令里面查看blog
7.文件中查找184b的线程ID信息,就能够找到是哪一个线程致使的内存占用太高,同时也能看到具体的代码位置