下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程。如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下。
公司主营业务:成都网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出娄烦免费做网站回馈大家。
1、Java CPU过高的问题排查
举个例子,如下:
- package com.classloading;
- public class Test {
- static class MyThread extends Thread {
- public void run() { // 死循环,消耗CPU
- int i = 0;
- while (true) {
- i++;
- }
- }
- }
- public static void main(String args[]) throws InterruptedException {
- new MyThread().start();
- Thread.sleep(10000000);
- }
- }
使用top命令查看占用CPU过高的进程。如下图所示。
查看进程6102下线程的占用情况,如下图所示。
使用如下命令将6122转换为16进制表示,如下:
导出CPU占用高进程的线程栈。命令如下:
- jstack pid >> java.txt
内容如下:
- mazhi@mazhi:~$ cat java.txt
- Attaching to remote server pid, please wait...
- 2021-02-23 15:38:18
- Full 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: RUNNABLE
- at 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;
- public class Test {
- private static final int UNIT_MB = 1024 * 1024;
- public static void main(String args[]) throws InterruptedException{
- List