1 实战:内存溢出的定位与分析
1.1 内存溢出与内存泄露
- 内存溢出,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;
- 内存泄露,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
1.2 模拟内存溢出
编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程序能够正常执行,最后打印ok。
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");
}
}
设置参数:
#参数如下:
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
#指定路径
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=F:\t\dump.hprof
#手动dump内存
#用法:
jmap -dump:format=b,file=dumpFileName
#示例
jmap -dump:format=b,file=/tmp/dump.dat 6219
1.3 运行测试
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid14768.hprof …
Heap dump file created [8127578 bytes in 0.026 secs]
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
可以看到,当发生内存溢出时,会dump内存到java_pid14768.hprof文件中,该文件在项目的根目录下。
1.4 导入到MAT工具中进行分析
1.4.1 MAT工具介绍
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。
官网地址:https://www.eclipse.org/mat/
1.4.2 下载安装
下载地址:https://www.eclipse.org/mat/downloads.php
1.4.3 导入分析


查看对象以及它的依赖:

查看可能存在内存泄露的分析:


可以看到,有91.02%的内存由Object[]数组占有,所以比较可疑。
查看详情:

可以看到集合中存储了大量的uuid字符串。
2 实战:死锁问题
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等,我们该如何分析呢?
由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所以就需要看下jvm的内部线程的执行情况,然后再进行分析查找出原因。
这个时候,就需要借助于jstack命令了,jstack的作用是将正在运行的jvm的线程 情况进行快照,并且打印出来:
#用法:jstack <pid>
2.1 构造死锁
编写代码,启动2个线程,Thread1拿到了obj1锁,准备去拿obj2锁时,obj2已经被Thread2锁定,所以发生了死锁。
public class TestDeadLock {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
pu
JVM故障诊断实战

本文通过实战案例,详细解析了如何使用MAT工具定位与分析内存溢出问题,以及利用jstack命令解决死锁问题,提供了具体代码示例与操作步骤。
最低0.47元/天 解锁文章
86万+

被折叠的 条评论
为什么被折叠?



