zoukankan      html  css  js  c++  java
  • 面试问题---JAVA程序CPU占用过高怎么定位

    今天一个电话面试问了这个问题。回来查了下答案,自己也顺带操作一遍,做个记录。之前只知道jstack工具可以查看线程状态这些。比如死锁这些,主要是之前不知道top -H -p pid这个命令的使用,这命令可以看到进程下面线程信息,拿到线程ID,然后再结合jstack命令使用就可以解决这个问题了。下面记录一下具体的操作步骤:

    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插件 打包jar

                <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  运行程序

     一直在输出

    3.top |grep java  或者 jps指令找到java进程的pid(6167)

    4. top -H -p pid   以线程的形式查看该进程 top -H -p 6167

     因为我们程序是起了50个线程 所以这里就会展示这个进程中的所有线程呢

    5.前面的线程ID是10进制的,,需要转换成16进制,,因为等下在jstack命令取出来的线程ID是16进制的:这里就随便选一个线程ID 去转换了,真实环境肯定是选择CPU占用率最高的那个线程,echo "obase=16;6219" | bc

    6.jstack 6167 >threadInfo.txt   信息输出到文件 然后查看。也可以直接在命令里面查看

    7.文件中查找184b的线程ID信息,就可以找到是哪个线程导致的内存占用过高,同时也能看到具体的代码位置

  • 相关阅读:
    [转]eclipse转idea, 快捷键设置
    钻牛角尖还是走进死胡同--shell脚本根据名称获得 dubbo 服务的 pid
    SmartSVN has inconsistent newlines解决方法
    解决Mac java.net Local host name unknown error的方法
    Jenkins持续集成环境, 如何自定义 maven repositories
    如何用dat批处理文件关闭某端口对应程序-Windows自动化命令
    ionic 总结
    window resize的时候禁止频繁触发事件
    AJAX工作原理及其优缺点
    利用JS提交表单的几种方法和验证
  • 原文地址:https://www.cnblogs.com/nijunyang/p/13040511.html
Copyright © 2011-2022 走看看