下面通过模拟实例分析排查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=9os_prio=0tid=0x00007f4ee0001000nid=0x1956runnable [0x0000000000000000]

java.lang.Thread.State: RUNNABLE

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

"Thread-0" #9 prio=5os_prio=0tid=0x00007f4f180d6000nid=0x17earunnable [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{

Listx=newArrayList();

int i=0;

while(i<1000){

x.add(new byte[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/ );如果快照文件很大,可以在服务器上直接分析,使用的命令是:

jhat dump.hprof

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

访问如下图所示。

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

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

点赞 0

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

  1. java 死锁 内存消耗_详解Java中synchronized关键字的死锁和内存占用问题

    先看一段synchronized 的详解: synchronized 是 java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并 ...

  2. Java吃CPU还是内存_Java中的CPU占用高和内存占用高的问题排查

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

  3. java 线程 cpu_java程序中线程cpu使用率计算

    最近确实遇到题目上的刚需,也是花了一段时间来思考这个问题. cpu使用率如何计算 计算使用率在上学那会就经常算,不过往往计算的是整个程序执行的时间段,现在突然要实时计算还真有点无奈,时间段如何选择是个 ...

  4. java 锁定界面_Java中的锁

    java中的锁遵循不同的分类方法,太多了,乐观锁/悲观锁,可重入锁/不可重入锁,有些第一遇到的话,可能还有点懵.刚好周末有时间学习下,总结和梳理下. 一总述 总的来说对java的锁有以下七种分类方法: ...

  5. java内存堆和栈_java中堆,栈主要区别及内存存储

    java堆.栈.堆栈的区别 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度 ...

  6. 计算机主机的cpu作用,电脑中的CPU是什么意思

    很多小伙伴在电脑里可以看见cpu,但是却不知道cpu的意思是什么,其实CPU是一块超大规模的集成电路,算是一台计算机的运算核心和控制核心,而且cpu的占用越高说明该软件的负担也就越大,具体的详情下面一 ...

  7. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  8. java thread join()_Java中Thread.join()的使用方法

    概要 本文分三个部分对thread.join()进行分析: 1. join() 的示例和作用 2. join() 源码分析 3. 对网上其他分析 join() 的文章提出疑问 1. join() 的示 ...

  9. java file 方法_JAVA中File的常用方法

    一.File类中包含了很多获得文件或文件夹属性的方法,使用起来比较方便,下面将常见的方法介绍如下: a.createNewFile方法 public boolean createNewFile() t ...

最新文章

  1. 来电通java版_终于有人把Java程序员必学知识点整理出来了,令人有如醍醐灌顶...
  2. 高中数学?_JAVA
  3. Java:自定义异常处理类
  4. [云炬创业基础笔记]第一章创业环境测试10
  5. 【文件系统】删除文件名中含有空格的文件
  6. 3.5. Buttons
  7. [vue] vue实例挂载的过程是什么?
  8. js 滚动条自动滚动到最底部
  9. GCC 命令行具体解释
  10. win11正式版iso镜像如何安装 windows11正式版iso镜像安装方法
  11. MySql服务无法连接
  12. 台达plc自由口通讯_台达PLC的通信协议??
  13. 在DW中如何让代码对齐?
  14. Acer 4750 安装黑苹果_黑苹果安装 你要知道的那些坑
  15. 打开chm文件c语言,chm格式,手把手教你chm文件怎么打开
  16. java毕业设计成品SpringBoot+VUE实现的电影院会员积分管理系统
  17. 重庆大学计算机组装与维护,重庆大学2020年春季学期课程作业计算机组装与维护(37页)-原创力文档...
  18. 2022数学建模国赛B题:无人机定位(国二分享)
  19. vue 前端中如何改变图标大小
  20. 全网最详细的Neo4j安装教程

热门文章

  1. html5图片剪切板,JavaScript 网页端复制图片到剪切板
  2. kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门
  3. 石头剪刀布程序流程图_石头剪刀布!我要与电脑决战到天明!(14天)
  4. html和css如何制作小球,[网页设计]使用CSS3动画模拟实现小球自由落体效果
  5. mysql导入数据提前修改字段_复习MySQL③导入数据、检查及修改
  6. Win7笔记本查看无线网卡是否“支持的承载网络”的方法
  7. 腾讯视频安卓版下载_腾讯课堂上传课程视频
  8. 百度地图API实现地图应用
  9. spring源码阅读--@Transactional实现原理
  10. Spring初始化:org.springframework.we...ContextLoaderListener的作用