C语言 提取线程执行情况6,JVM学习系列学习七 - osc_8nnvoyb1的个人空间 - OSCHINA - 中文开源技术交流社区...

JVM学习系列学习七

凯哥java 凯哥java

5:实战:内存溢出的定位与分析

内存溢出在日常工作中,这个错误很容易遇到。遇到内存溢出,首先我们需要快速定位内存溢出的环节(位置),需要进行分析,看看是正常情况还是非正常情况。如果是正常情况,这个时候我们需要加大内存。如果是非正常情况,就需要对我们的程序进行修改,来修复这个问题。

首先,我们需要学会如何定位问题,然后在对问题进行分析,如何定位问题?这里我们可以借助于jmap与MAT工具进行分析。

5.1:模拟内存溢出

场景:

我们向list集合中添加100W个字符串,每个字符串再由100个UUID组成。如果可以正常执行,最后打印出OK。

/**

* Created by kaigejava on 2019/7/3.

*模拟内存溢出的

*/

@Slf4j

public class TestJvmOutOfMemory {

/**

* 内存溢出

*/

@Test

public void jvmOutOfMemoryTest(){

List list = new ArrayList<>();

for (int i = 0; i < 10000000; i++) {

System.out.println(i);

String str = "";

for (int j = 0; j < 1000; j++) {

str += UUID.randomUUID().toString();

}

list.add(str);

}

System.out.println("ok");

}

}

设置程序运行的JVM内存大小:

081b131a98e6ce7c1655da3b4cc6dc11.png

Edit Configurations

587f29517811386e498a77bd5ae3af21.png

设置VM options的值:-Xms6m -Xmx6m -XX:+HeapDumpOnOutOfMemoryError

设置完成之后,我们运行程序:

5.2:运行内存溢出程序

3635dd9abf10629bec9eacd80263ad29.png

我们发现当外出循环i=50的时候就发生了内存溢出。

错误文件:Dumping heap to java_pid14200.hprof

我们借助于:Everything快速找到文件。

f748d3457adc1f38c25c5e374eb80312.png

导入到MAT中,进行分析。

5.3:导入MAT中,进行分析

9f789000685ab057d1f69ff1ad7c9821.png

导入分析后,我们发现77.37%也就是4.6MB都被java.lang.object[]数组占用了。

经过分析,我们发现这个object数组占用这么大,很可疑,这个就有可能是导致内存溢出的原因。

在接着查看详情:

9f089582b8149aeabdcefb12593bbe88.png

d2c4ec865ef2bef02887e0102d502763.png

我们发现集合中存放了大量的UUID数据。符合我们的测试。达到了我们的实验目的。

本实验只是为了模拟内存溢出,怎么分析问题。

在下一个阶段中,我们将要学习怎么查看JVM中的线程执行情况。

6:jstack的使用

有些时候,我们需要查看下JVM中的线程执行情况。比如,发现服务器的CPU负荷突然增高了,出现了死锁、死循环等情况,这些情况下,我们又该如何分析呢?

由于程序是正常运行的,没有任意异常输出,从日志方面也看不出什么问题的,所以就需要查看JVM的内部线程执行情况了,然后再进行分析查找原因。

这个时候,就需要借助另外一个命令了:jstack命令。

Jstack的作用是将正在运行的JVM的线程进行快照,并打印出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值