Java中的CPU占用高和内存占用高的问题排查
下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程。如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下。
1、Java CPU过高的问题排查
举个例子,如下:
package com.classloading;publicclassTest {staticclassMyThreadextendsThread {publicvoidrun() { // 死循环,消耗CPUint i = 0;while (true) {i++;}}}publicstaticvoidmain(String args[]) throws InterruptedException {new MyThread().start();Thread.sleep(10000000);}}使用top命令查看占用CPU过高的进程。如下图所示。

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

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

导出CPU占用高进程的线程栈。命令如下:
jstack pid >> java.txt内容如下:
mazhi@mazhi:~$ cat java.txtAttaching to remote server pid, please wait...2021-02-2315:38:18Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode):"Attach Listener"#10 daemon prio=9 os_prio=0 tid=0x00007f4ee0001000 nid=0x1956 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE// 这是0x17ea线程,也是占用CPU最高的线程"Thread-0"#9 prio=5 os_prio=0 tid=0x00007f4f180d6000 nid=0x17ea runnable [0x00007f4f044da000]java.lang.Thread.State: RUNNABLEat com.cpuhigh.Test$MyThread.run(Test.java:8) // 这里指示第8行,则正是死循环的代码开始...导出的堆栈信息有线程的状态(一般要找RUNNABLE状态)和调用堆栈结合来查找问题。线程dump分析:线程dump分析主要目的是定位线程长时间停顿的原因

2、Java 内存过高的问题排查
举个例子如下:
package com.classloading;import java.util.ArrayList;import java.util.List;publicclassTest {privatestaticfinalint UNIT_MB = 1024 * 1024;publicstaticvoidmain(String args[]) throws InterruptedException{List<Object> x = new ArrayList<Object>();int i = 0;while(i<1000){x.add(newbyte[UNIT_MB]);i++;}Thread.sleep(1000000000);}}通过jmap dump内存快照。 如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。
命令行输入:
jmap -histo <pid> | head -20就可以查看某个pid的java服务占用内存排名前20的类,如下图所示。

可以看到,占用内存最多的是byte字节数组,共有1008个实例。
jmap 还有一个指令可以把整个内存情况转成文件形式保存下来,如下:
jmap -dump:format=b,file=filename.bin <pid>执行命令如下图所示。

可以在JVM启动时设置,如果发生OOM,则dump出文件。命令如下:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof如果快照文件不大,可以下载到本地,然后通过 MAT 分析,也可以在线分析( https://fastthread.io/ );如果快照文件很大,可以在服务器上直接分析,使用的命令是:
jhat dump.hprofjhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持 对象查询语言 。命令执行后如下图所示。

访问如下图所示。

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

END
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2022-08-03 苹果笔记本重装系统mac教程