内存爆炸、CPU100%问题定位

目录

  • 一、内存爆炸相关
    • 1、关于-Xms(最小堆内存)和-Xmx(最大堆内存)
    • 2、JVM初始化时申请实际物理内存
    • 3、OutOfMemory问题排查
      • (1) 堆内存溢出排查
      • (2) 堆外内存溢出排查
  • 二、CPU 100及死锁问题定位
    • 1、CPU 100问题排查
      • (1) 找到程序对应进程号
      • (2) 查找进程对应的线程编号
      • (3)查看线程堆栈信息
    • 2、死锁问题排查

一、内存爆炸相关

1、关于-Xms(最小堆内存)和-Xmx(最大堆内存)

最大堆内存为JVM能向操作系统申请的最大内存。最小堆内存并不是程序一启动就申请这么多内存,而是当前进程如果申请的内存已超过最小堆内存,内存回收时,大于最小堆内存的部分会返回给操作系统,其它申请的内存不会。

2、JVM初始化时申请实际物理内存

默认没有配置-XX:+AlwaysPreTouch参数时,JVM进程申请的内存只是虚拟内存,程序运行时根据虚拟内存地址映射到实际的物理内存,缺页时才将数据加载到物理内存,分配实际的物理空间。加上-XX:+AlwaysPreTouch参数后,程序将直接分配到实际的物理内存,而不是根据需要在缺页时才申请物理内存。

简单来说就是没有开启预热时,JVM只是向操作系统做了登记,告诉操作系统我需要多少内存,但实际上并没有进行物理分配,加上该参数后在程序启动时就会分配物理内存。

注意:加上该参数可能会导致程序启动变慢。

3、OutOfMemory问题排查

(1) 堆内存溢出排查

内存溢出示例如下:

/*** -Xmx512m -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Users\Administrator\Desktop\java_heapdump.hprof*/
public class OutOfMemoryExample1 {private static List<Object> space = new ArrayList<>();public static void main(String[] args) throws Exception {// 内存泄漏 最终会导致 = 内存溢出for (int i = 0; i < 1000; i++) {space.add(new byte[1024 * 1024 * 128]);Thread.sleep(3000L);}}
}

通过MAT(Eclipse Memory Analyzer)工具查找leak suspect即可排查:

在这里插入图片描述

(2) 堆外内存溢出排查

直接内存溢出示例:

/*** 堆外内存溢出* 控制堆外内存大小:-XX:MaxDirectMemorySize=128m -XX:+HeapDumpOnOutOfMemoryError*/
public class OutOfMemoryExample2 {private static List<Object> space = new ArrayList<>();public static void main(String[] args) throws Exception {// 内存泄漏 最终会导致  内存溢出for (int i = 0; i < 1000; i++) {ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024 * 1024 * 64);byteBuffer.put(new byte[1024 * 1024 * 5]);space.add(byteBuffer);Thread.sleep(2000L);}}
}

对于堆外内存溢出的情况,通过jvisualvm中的btrace插件分析调用情况,如下:
在这里插入图片描述


二、CPU 100及死锁问题定位

1、CPU 100问题排查

CPU占用率过高通常是因为死循环或者递归调用导致的,通过jstack基本能定位到具体是哪些线程在执行CPU高度密集型操作。示例代码如下:

public class Cpu100Example {public static void main(String[] args) {System.out.println("Starting executing the programme");// 如果有多核,开启与逻辑cpu相等的线程数执行计算型任务即可,不要有阻塞或者I/O操作while (true) {new Random().nextInt();}}
}

问题解决思路如下:

(1) 找到程序对应进程号

通过jps或者jcmd命令可查到程序进程号,如下:

[universe@VM_0_13_centos ~]$ jps -l
2792 org.apache.zookeeper.server.quorum.QuorumPeerMain
2745 org.apache.zookeeper.server.quorum.QuorumPeerMain
30858 com.netease.issue.cpu.Cpu100Example
2716 org.apache.zookeeper.server.quorum.QuorumPeerMain
31822 sun.tools.jps.Jps

(2) 查找进程对应的线程编号

top -H -p 30858

结果如下:
在这里插入图片描述
从上图可以看到,pid为30859的线程几乎占用了全部CPU。

(3)查看线程堆栈信息

jstack命令内容中的nid为上一步我们获取到的线程pid的16进制形式,因此先把线程pid转换为16进制,再对jstack内容进行查找。

在这里插入图片描述
现在可以看到该线程的方法调用栈,进而找到相应的代码。

2、死锁问题排查

示例代码如下:

public class DeadLockExample {private static Object monitor1 = new Object();private static Object monitor2 = new Object();public static void main(String[] args) {new Thread(new ObtainLockTask1()).start();new Thread(new ObtainLockTask2()).start();}private static class ObtainLockTask1 implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " starts to obtain lock from monitor1");try {while (true) {synchronized (monitor1) {System.out.println(Thread.currentThread().getName() + " has obtained lock from monitor1");Thread.sleep(3000);synchronized (monitor2) {System.out.println(Thread.currentThread().getName() + " starts to obtain lock from monitor2");}}}} catch (InterruptedException e) {e.printStackTrace();}}}private static class ObtainLockTask2 implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " starts to obtain lock from monitor2");try {while (true) {synchronized (monitor2) {System.out.println(Thread.currentThread().getName() + " has obtained lock from monitor2");Thread.sleep(3000);synchronized (monitor1) {System.out.println(Thread.currentThread().getName() + " starts to obtain lock from monitor1");}}}} catch (InterruptedException e) {e.printStackTrace();}}}
}

依然通过jstack命令查看线程堆栈信息可以定位,如下图:
在这里插入图片描述

注意:通过synchronized关键字导致的Java平台级死锁通过jstack命令可以直接分析出来,而使用ReentrantLock导致的死锁则不能。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Hive] if返回null和0的区别

count(if(pv>1000000,1,0))count(if(pv>1000000,1,null)) 区别 count(if(pv>1000000,1,0)) 和 count(if(pv>1000000,1,null)) 之间的区别在于对于不满足条件的情况下的处理方式。 count(if(pv>1000000,1,0))&#xff1a;这个表达式中&#xff0c;如果 pv 的值…

【Godot】给不规则的 TileMap 划分子区域块部分代码

4.1.beta2 给不规则的 TileMap 划分子区域块部分代码 ## 生成房间内部数据 func generate_room_inside_data():GLog.info("生成房间内部数据")# 划分房间的各个矩形块for room_coords in room_coords_to_data:var room_data room_coords_to_data[room_coords] as D…

零基础入门网络渗透到底要怎么学?_网络渗透技术自学

前言&#xff1a; 很多朋友问我&#xff0c;想搞网络安全&#xff0c;编程重要吗&#xff0c;选什么语言呢&#xff1f; 国内其实正经开设网络安全专业的学校很少&#xff0c;大部分同学是来自计算机科学、网络工程、软件工程专业的&#xff0c;甚至很多非计算机专业自学的。…

使用自定义 PyTorch 运算符优化深度学习数据输入管道

在这篇文章[1]中&#xff0c;我们讨论 PyTorch 对创建自定义运算符的支持&#xff0c;并演示它如何帮助我们解决数据输入管道的性能瓶颈、加速深度学习工作负载并降低训练成本。 构建 PyTorch 扩展 PyTorch 提供了多种创建自定义操作的方法&#xff0c;包括使用自定义模块和/或…

驱动day2:LED灯实现三盏灯的亮灭

head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_PE_MODER 0x50006000 #define PHY_PF_MODER 0x50007000 #define PHY_PE_ODR 0x50006014 #define PHY_PF_ODR 0x50007014 #define PHY_RCC 0x50000A28#endif 应用程序 #include <stdio.h> #include <sys/…

Linux性能优化--补充

14.1. 性能工具的位置 本书描述的性能工具来源于Internet上许多不同的位置。幸运的是&#xff0c;大多数主要发行版都把它们放在一起&#xff0c;包含在了其发行版的当前版本中。表A-1描述了全部工具&#xff0c;提供了指向其原始源位置的地址&#xff0c;并注明它们是否包含在…

YOLOv7改进实战 | 更换轻量化主干网络Backbone(一)之Ghostnet

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

官方认证:研发效能(DevOps)工程师职业技术认证

培养端到端的研发效能人才 为贯彻落实《关于深化人才发展体制机制改革的意见》&#xff0c;推动实施人才强国战略&#xff0c;促进专业技术人员提升职业素养、补充新知识新技能&#xff0c;实现人力资源深度开发&#xff0c;推动经济社会全面发展&#xff0c;根据《中华人民共…

Apache Doris (四十五): Doris数据更新与删除 - Sequence 列

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 基本原理

WGCNA分析教程五 | [更新版]

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 往期WGCNA分析教程 WGCNA分析 | 全流程分析代码 | 代码一 WGCNA分析 | 全流程分析代码 | 代码二 WGCNA分析 | 全流程分析代码 | 代码四 关于WGCNA分析教程日常更新 学习无处不在&#xff0c;我们的教程会在…

[环境配置]anaconda3的base环境与python版本对应关系表

anaconda3版本 base环境对应python版本 Anaconda3-2018.12-Windows-x86_64.exe 3.7 Anaconda3-2019.03-Windows-x86_64.exe 3.7 Anaconda3-2019.07-Windows-x86_64.exe 3.7 Anaconda3-2019.10-Windows-x86_64.exe 3.7 Anaconda3-2020.02-Windows-x86_64.exe 3.7 An…

Alpine.js 精简重

建议有 js 基础&#xff0c;先阅读官网文档&#xff0c;如果您会 vue 类似框架&#xff0c;上手会更快 https://alpinejs.dev js 代码中可以使用 Alpine.sore 定义全局数据 Alpine.store(tabs, {current: first,items: [first, second, third], }) x-text 可以运算任何 js 表…

ubuntu16.04下标定Astra相机

ubuntu16.04下标定Astra相机 1.安装相机驱动 rosrun camera_calibration cameracalibrator.py --size 7x5 --square 0.018 image:/camera/rgb/image_raw camera:/camera/rgb 2.下载camere_calibration 3.进行标定 打开终端&#xff0c;输入 roslaunch astra_launch astrap…

从入门到进阶 之 ElasticSearch 配置优化篇

&#x1f339; 以上分享从入门到进阶 之 ElasticSearch 配置优化篇&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏…

浏览器不能访问阿里云ECS

一、浏览器不能访问端口 在阿里云ECS中构建了工程&#xff0c;nigix或者tomcat或者其他&#xff0c;然后在本地浏览器访问ip端口的时候&#xff0c;连接超时&#xff0c;解决办法&#xff1a; 进入阿里云ECS服务 -> 查看公网ip (外部连接需要使用公网) -> 进入ECS实例的…

攻防世界web篇-cookie

看到cookie立马就会想到F12键看cookie的一些信息 我这个实在存储里面看的&#xff0c;是以.php点缀结尾&#xff0c;可以试一下在链接中加上.php 得到的结果是这样 这里&#xff0c;我就只能上csdn搜索一下了&#xff0c;看到别人写的是在get请求中可以看到flag值

Mysql 约束,基本查询,复合查询与函数

文章目录 约束空属性约束默认值约束zerofill主键约束自增长约束唯一键约束外键约束 查询select的执行顺序单表查询排序 updatedelete整张表的拷贝复合语句group by分组查询 函数日期函数字符串函数数学函数其他函数 复合查询合并查询union 约束 空属性约束 两个值&#xff1a…

Windows安装Jenkins

JDK 11 以上 https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.20%2B8/OpenJDK11U-jdk_x64_windows_hotspot_11.0.20_8.msi https://www.jenkins.io/download/ 下载windows安装版本 授权用户administrator logon as services windows(server)安装…

操作系统【OS】中断和异常

异常&#xff08;内中断&#xff09; 中断&#xff08;外中断&#xff09; 基本概念 由CPU执行指令内部产生的事件内中断都是不可屏蔽中断&#xff0c;一旦出现&#xff0c;就要立即处理。 由来自CPU外部的设备发出的中断请求&#xff08;常用于输入输出&#xff09;典型的由…

element-ui 以CDN 方式引入原生js开发的几个别坑 (+vue)

element-ui 以CDN 方式引入原生js开发的几个坑 最近两个月太忙了 忙的没空写文章 两个月赶出来了几个的项目 一个是雪佛兰裸眼3D的一个商品屏幕展示项目 一个是广汽云渲染的一个云看车项目 一个是奥迪中国充电桩的网页开发项目&#xff0c; 奥迪中国做个饭也是目前正在做的 不…