专栏首页凯哥JavaJVM学习系列学习七
原创

JVM学习系列学习七

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

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

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

5.1:模拟内存溢出

场景:

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

/*** Created by kaigejava on 2019/7/3.*模拟内存溢出的*/@Slf4jpublic class TestJvmOutOfMemory {   /**    * 内存溢出    */   @Test   public void jvmOutOfMemoryTest(){       List<Object> 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内存大小:

Edit Configurations

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

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

5.2:运行内存溢出程序

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

错误文件:Dumping heap to java_pid14200.hprof

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

导入到MAT中,进行分析。

5.3:导入MAT中,进行分析

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

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

在接着查看详情:

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

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

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

6:jstack的使用

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

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

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

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

本文来源:凯哥个人博客(www.kaigejava.com)

凯哥公众号:凯哥Java(kaigejava)

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • swing 小项目

    Java 图形界面开发--图文并茂建立学生管理系统https://zhuanlan.zhihu.com/p/24187939

    凯哥Java
  • RabbitMQ学习系列教程三:快速入门

    凯哥Java
  • 高性能服务器架构思路(一)——缓冲策略

    在服务器端程序开发领域,性能问题一直是备受关注的重点。业界有大量的框架、组件、类库都是以性能为卖点而广为人知。然而,服务器端程序在性能问题上应该有何种基本思路,...

    凯哥Java
  • 科个普啦--条件概率

    条件概率的意思是在某种条件下某件事发生的概率是多少。条件概率其实反应了一个朴素的概念,你平时在推理不确定的事情时,下意识的需要去找和事情有关的证据,因为证据越多...

    linxinzhe
  • 垃圾收集不健康的JVM,这是一种主动方法

    Netflix的云数据工程团队运行各种JVM应用程序,包括诸如Cassandra和Elasticsearch之类的流行数据存储。尽管我们大多数集群在分配给它们的...

    可大可小
  • 禁止页面进行右键、选择、F12操作

    通常在我们浏览网站的时候会遇到下面的情况,不能右键啊,鼠标也没问题啊,更换个浏览器,还是无用,最后弃之。其实,这是因为设计人员对页面启用禁止右键。主要是防止盗取...

    申霖
  • prometheus之部署安装Grafana

    关于如何部署prometheus本文就不再介绍,请参考prometheus部署安装。

    行 者
  • super关键字和继承中的潜规则

    关于继承的规矩很多,再加上初学者一般不会有太深的理解,所以学起来磕磕绊绊,绕来绕去,就差死记硬背了,我一直认为死记硬背的学习方法简直就是个灾难。

    用户5745563
  • 原 Mac下RabbitMq安装与测试教程

    一灰灰blog
  • 构建属于自己的原生docker images

    制作image原生镜像需要使用febootstrap工具,需要注意的是,在centos7系列中,默认的源中不带此包,但是在centos6系列中,该包是默认可用使...

    BGBiao

扫码关注云+社区

领取腾讯云代金券