九江市网站建设_网站建设公司_关键词排名_seo优化
2026/1/15 17:15:44 网站建设 项目流程

内存溢出案例

案例环境

案例代码

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询