700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > java cpu高_Java中的CPU占用高和内存占用高的问题排查

java cpu高_Java中的CPU占用高和内存占用高的问题排查

时间:2019-08-09 18:12:54

相关推荐

java  cpu高_Java中的CPU占用高和内存占用高的问题排查

下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程。如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下。

1、Java CPU过高的问题排查

举个例子,如下:

packagecom.classloading;

publicclassTest{

staticclassMyThreadextendsThread{

publicvoidrun(){//死循环,消耗CPU

inti=0;

while(true){

i++;

}

}

}

publicstaticvoidmain(Stringargs[])throwsInterruptedException{

newMyThread().start();

Thread.sleep(10000000);

}

}

使用top命令查看占用CPU过高的进程。如下图所示。

查看进程6102下线程的占用情况,如下图所示。

使用如下命令将6122转换为16进制表示,如下:

导出CPU占用高进程的线程栈。命令如下:

jstackpid>>java.txt

内容如下:

mazhi@mazhi:~$catjava.txt

Attachingtoremoteserverpid,pleasewait...

-02-2315:38:18

FullthreaddumpJavaHotSpot(TM)64-BitServerVM(25.192-b12mixedmode):

"AttachListener"#10daemonprio=9os_prio=0tid=0x00007f4ee0001000nid=0x1956runnable[0x0000000000000000]

java.lang.Thread.State:RUNNABLE

//这是0x17ea线程,也是占用CPU最高的线程

"Thread-0"#9prio=5os_prio=0tid=0x00007f4f180d6000nid=0x17earunnable[0x00007f4f044da000]

java.lang.Thread.State:RUNNABLE

atcom.cpuhigh.Test$MyThread.run(Test.java:8)//这里指示第8行,则正是死循环的代码开始

...

导出的堆栈信息有线程的状态(一般要找RUNNABLE状态)和调用堆栈结合来查找问题。线程dump分析:线程dump分析主要目的是定位线程长时间停顿的原因

2、Java 内存过高的问题排查

举个例子如下:

packagecom.classloading;

importjava.util.ArrayList;

importjava.util.List;

publicclassTest{

privatestaticfinalintUNIT_MB=1024*1024;

publicstaticvoidmain(Stringargs[])throwsInterruptedException{

Listx=newArrayList();

inti=0;

while(i<1000){

x.add(newbyte[UNIT_MB]);

i++;

}

Thread.sleep(1000000000);

}

}

通过jmap dump内存快照。 如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。

命令行输入:

jmap-histo|head-20

就可以查看某个pid的java服务占用内存排名前20的类,如下图所示。

可以看到,占用内存最多的是byte字节数组,共有1008个实例。

jmap 还有一个指令可以把整个内存情况转成文件形式保存下来,如下:

jmap-dump:format=b,file=filename.bin

执行命令如下图所示。

可以在JVM启动时设置,如果发生OOM,则dump出文件。命令如下:

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/tmp/heapdump.hprof

如果快照文件不大,可以下载到本地,然后通过 MAT 分析,也可以在线分析( https://fastthread.io/ );如果快照文件很大,可以在服务器上直接分析,使用的命令是:

jhatdump.hprof

jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持 对象查询语言 。命令执行后如下图所示。

访问如下图所示。

其中的Show heap histogram就会显示对象占用内在的大小。如下图所示。

【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。