news 2026/5/8 23:43:59

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/5/2 14:39:02

雷家林(レイ・ジアリン)詩歌集録 その十四(日译版)

&#xff08;禅语&#xff09;万道の仏光が中華を照らし、悪鬼や妖怪は鳴き聲を上げる場所がない。世の中の苦しみは何千種もあるが、慈悲深い般若の花を散らそう。&#xff08;嫦娥&#xff09;毎夜、故郷を思いながら帰ることができないのが惜しい。清らかな心は寒い月の雰囲…

作者头像 李华
网站建设 2026/5/3 17:18:53

雷家林(レイ・ジアリン)詩歌集録 その十五(日译版)

方雷大野家林Lei Jialin独立独立して一枝を持ち、湘波を俯みます。 洞庭の木が落ちるのはどうしようもないです。 行吟しながら沢の畔を歩き、人は憔悴しています。 自分が人を怜れんで、自分で歌います。云封雲がこの世を封じ、桃源を守ります。 秦の人々は自らの自在な世界を…

作者头像 李华
网站建设 2026/4/26 17:14:15

交通仿真软件:Paramics_(2).交通仿真基础理论

交通仿真基础理论 在上一节中&#xff0c;我们介绍了交通仿真的基本概念和应用领域。接下来&#xff0c;我们将深入探讨交通仿真软件的基础理论&#xff0c;这些理论是理解交通仿真软件如何工作的关键。本节将涵盖以下几个方面&#xff1a; 1. 交通流理论 交通流理论是交通仿真…

作者头像 李华
网站建设 2026/5/6 17:32:03

macOS恢复模式终端备份脚本:无依赖、保层级、避冲突的完整方案

macOS恢复模式终端备份脚本&#xff1a;无依赖、保层级、避冲突的完整方案 文章目录macOS恢复模式终端备份脚本&#xff1a;无依赖、保层级、避冲突的完整方案一、恢复模式备份的核心痛点二、核心功能与实现逻辑三、关键技术点与解决方案1. 替代缺失命令&#xff1a;用纯bash实…

作者头像 李华
网站建设 2026/5/8 15:11:45

基于Simulink的微电网中储能主控单元协调运行仿真

目录 手把手教你学Simulink 一、引言:为什么微电网需要“储能主控单元”? 二、系统整体架构 控制角色分配: 三、理论基础:下垂控制(Droop Control) 1. 有功-频率下垂(P-f) 2. 无功-电压下垂(Q-V) 四、Simulink 建模全流程 步骤1:主电路搭建(Simscape Elec…

作者头像 李华