news 2026/4/23 13:01:47

JVM 内存溢出和死锁检测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JVM 内存溢出和死锁检测

内存溢出案例

案例环境

案例代码

package com.hero.jvm.memory;importjava.util.ArrayList;importjava.util.List;importjava.util.UUID;public class TestJvmOutOfMemory{public static void main(String[]args){List<Object>list=new ArrayList<>();for(int i=0;i<10000000;i++){String str="";for(int j=0;j<1000;j++){str+=UUID.randomUUID().toString();}list.add(str);}System.out.println("ok");}}

JVM 参数

  1. 让案例尽快 OOM
  2. 开启发生 OOM 时自动 dump 堆快照
#参数如下:-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError

执行结果

溢出打印

java.lang.OutOfMemoryError: Java heap space Dumping heap to java_pid31092.hprof... Heap dumpfilecreated[8453096bytesin0.031secs]Exceptioninthread"main"java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332)at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)at java.lang.StringBuilder.append(StringBuilder.java:136)at com.hero.TestJvmOutOfMemory.main(TestJvmOutOfMemory.java:13)

dump 了堆快照文件

导入 MAT 分析

可以看到,有81.72%的内存由Object[]数组占有,所以比较可疑。

分析:这个可疑是正确的,因为已经有超过80%的内存都被它占有,这是非常有可能出现内存溢出的。

直接看对象详情

死锁检测

如果在生产环境发生了死锁,我们将看到的是部署的程序没有任何反应了,这个时候我们可以借助jstack进行分析,下面我们实战下查找死锁的原因。

案例环境

publicclassTestDeadLock{privatestaticObjectobj1=newObject();privatestaticObjectobj2=newObject();publicstaticvoidmain(String[]args){newThread(newThread1()).start();//启动线程01newThread(newThread2()).start();//启动线程02}//线程01privatestaticclassThread1implementsRunnable{@Overridepublicvoidrun(){synchronized(obj1){System.out.println("Thread1 拿到了 obj1 的锁!");try{// 停顿2秒的意义在于,让Thread2线程拿到obj2的锁Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(obj2){System.out.println("Thread1 拿到了 obj2 的锁!");}}}}//线程02privatestaticclassThread2implementsRunnable{@Overridepublicvoidrun(){synchronized(obj2){System.out.println("Thread2 拿到了 obj2 的锁!");try{// 停顿2秒的意义在于,让Thread1线程拿到obj1的锁Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();}synchronized(obj1){System.out.println("Thread2 拿到了 obj1 的锁!");}}}}}

使用 Jstack 分析

命令:jstack 18487 | grep ‘BLOCKED’ -A 15 --color

发现两个互相等待锁的线程

使用 Arthas 分析死锁

thread-b 命令

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:52:58

清华字节跳动首创视频换脸新纪元:让照片主角完美融入视频场景

这项由清华大学和字节跳动智能创作实验室联合开展的开创性研究于2026年1月发表&#xff0c;论文编号为arXiv:2601.01425v1。研究团队开发了一套名为DreamID-V的全新视频换脸技术框架&#xff0c;首次实现了将单张照片中的人物身份完美融入到任何视频场景中&#xff0c;同时保持…

作者头像 李华
网站建设 2026/4/23 11:20:35

香港科技大学突破文本理解难题:让AI模型内部“自我改造“

这项由香港科技大学的唐翼轩和杨毅领导的研究发表于2025年1月&#xff0c;论文编号为arXiv:2601.01046v1。有兴趣深入了解的读者可以通过这个编号在学术数据库中查询完整论文。在当今这个信息爆炸的时代&#xff0c;我们每天都在和各种文本打交道——搜索信息、阅读文章、查找资…

作者头像 李华
网站建设 2026/4/22 18:41:32

这款甘特图我愿称之为2026年最强!免费开源太良心![特殊字符]

作为一个项目管理老鸟&#xff0c;我对甘特图工具可太挑剔了&#xff01;2026年了&#xff0c;市面上的甘特图工具卷得飞起&#x1f631; 我把目前热门的6款在线甘特图都体验了一遍&#xff0c;功能、易用性、价格全方位对比&#xff01;最后选出的这款&#xff0c;真的绝绝子&…

作者头像 李华
网站建设 2026/4/23 11:22:03

基于SpringBoot的足球社区管理系统毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在设计并实现一个基于SpringBoot框架的足球社区管理系统&#xff0c;以满足足球爱好者在信息交流、赛事组织、社区互动等方面的需求。具体研究目的如下&…

作者头像 李华
网站建设 2026/4/23 11:22:34

【开题答辩全过程】以 人事管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华