当前位置: 首页 > news >正文

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 命令

http://www.jsqmd.com/news/226274/

相关文章:

  • 清华字节跳动首创视频换脸新纪元:让照片主角完美融入视频场景
  • 交通仿真软件:Paramics_(5).交通流仿真
  • 阿尔伯塔大学新突破:让AI学会自我检查错误,准确率远超人工审核
  • 交通仿真软件:Paramics_(3).交通网络建模基础
  • 交通仿真软件:Paramics_(3).数据输入与处理
  • 上海交大突破:单一AI模型实现全视觉创作任务
  • 交通仿真软件:Paramics_(2).交通仿真基础理论
  • 从案例到技巧:Agentic AI提示设计的实战总结(提示工程架构师版)
  • 交通仿真软件:Aimsun_(21).交通仿真中的数据分析
  • 【图像加密】基于matlab混沌系统和DNA编码图像加密解密【含Matlab源码 14898期】含论文
  • 这款甘特图我愿称之为2026年最强!免费开源太良心![特殊字符]
  • 基于C++的《Head First设计模式》笔记——抽象工厂模式
  • 读懂 sap.m.URLHelper 文档里的 library: sap.m 与 Module: sap/m/library
  • macOS恢复模式终端备份脚本:无依赖、保层级、避冲突的完整方案
  • 【图像传输】基于matlab GUI格雷码编码MPSK图像传输系统【含Matlab源码 14896期】含报告
  • 【图像加密】基于matlab DNA结合arnold置乱变换实现彩色图像加密解密【含Matlab源码 14897期】
  • 【图像传输】格雷码编码MPSK图像传输系统【含GUI Matlab源码 14896期】含报告
  • TDengine Python 连接器入门指南
  • 基于Simulink的微电网中储能主控单元协调运行仿真
  • Qt OpenGL 生成Mipmap技术详解
  • 【图像加密】DNA结合arnold置乱变换实现彩色图像加密解密【含Matlab源码 14897期】
  • 【图像加密】混沌系统和DNA编码图像加密解密【含Matlab源码 14898期】含论文
  • 情感分析在广告效果评估中的创新应用
  • 导师不会告诉你:8款免费AI论文工具,轻松搞定真实参考文献!
  • 2026零基础小白能不能转行AI大模型?不会代码不懂编程?这一篇文章让你搞明白!
  • 痛定思痛:我花了一个月重构 AI 助手,只为了解决这三个问题
  • 异地就医备案-须知内容
  • 基于SpringBoot的拼装模型销售管理系统的设计与实现(源码+lw+部署文档+讲解等)
  • SAP UI5 概念辨析:namespace,library 和 module 的理解
  • 基于SpringBoot的陪诊服务平台系统(源码+lw+部署文档+讲解等)