一、Linux如何定位java进程占用系统资源使用率高的问题(简单实现)
- linux文件夹下先创建一个TheradDemo.java 文件,明显会在10行死循环,此时会大量占用cpu的资源。下面通过linux命令来定位这个问题
import java.util.Scanner;
public class ThreadDemo1{
public static void main(String[] args) throws Exception{
System.out.println(" Thread start...");
Thread t = new Thread(new Runnable(){
@Override
public void run(){
for(;;){ //10行-死循环处!!!!!!!
}
}
});
t.start();
t.join();
System.out.println("Thread end ...");
}}
- 编译并执行以上java文件,
- jps/ ps 查看当前进程的PID为4641
- top -p 4641 查看当前进程的资源使用情况
- top -Hp 4641 查看当前进程里的所有线程使用情况(看到有一个占用CPU最高的线程 4650)
- jstack 4641 输出当前进程中所有线程的调用栈信息
(查看和占用CPU最高的线程号4650相等的nid(16进制 0X122A),找到top命令输出的那个资源占用率高的线程调用栈信息)
- 找到调用栈信息最上面的代码提示(代码文件和行号)。在java代码上具体分析问题
java.lang.Thread.State: RUNNABLE
at ThreadDemo1$1.run(ThreadDemo1.java:10)
at java.lang.Thread.run(Thread.java:745)