本文共 1685 字,大约阅读时间需要 5 分钟。
本篇文章只讲述在遇到 OOM (java.lang.OutOfMemoryError:Java heap space) 这种情况如何利用工具分析问题,找到问题所在,关于JVM原理这方面的不过多深究。大家有兴趣的可以自行百度
本篇参考:狂神说 Java
首先,我们准备一个会触发 OOM 内存移除的小案例,代码如下:
package org.javaboy.test;import java.util.ArrayList;import java.util.List;/** * todo 要设置的 JVM 参数 -Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError * @Author: bai * @DateTime: 2020/7/4 19:38 */public class TestDemo3 { byte[] array = new byte[1 * 1024 * 1024]; public static void main(String[] args) { Listlist = new ArrayList (); int count = 0; try { while (true) { // 不停的 new 对象,大规律会触发 OOM 堆溢出问题 list.add(new TestDemo3()); count++; } } catch (Error e) { System.out.println(count); e.printStackTrace(); } }}
官网地址:
下载步骤就不 BB 了,傻瓜式操作,相信听说过 JVM 的小伙伴(夸你们已经是一个合格的程序员了),百度下载软件对你们来说都是小意思。本案例 Demo 是运行在 idea 上的,使用 jprofiler 分析工具前提,idea 也需要安装相应的插件,如下所示:
第二步设置 JProfiler 的位置,如下图所示:运行本案例之前,需要设置一些 JVM 的参数,命令如下:
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
经过上面的 JVM 参数设置,然后生成如下文件,我们直接双击打开。
通过 Biggest Objects 界面,我们可以很直观的看到到底是因为什么产生的内存溢出,很明显,这么长长的一串红颜色,想不注意都难啊。
通过这里可以直观的找到我们程序出错的位置,没错就是在 21 行。就是在这行,我们不停的在 new 对象,所以产生的内存溢出问题。
通过一个简单的小案例,学习了一些分析工具,对于生产环境遇到 OOM 异常,我们就可以通过这样的工具来分析问题所在,通过设置一些基本的 JVM 参数来得到 Dump 文件,然后通过工具分析错误位置,这样我们就可以知道什么原因造成的错误,最后,给大家总结了几条常用的 JVM 参数,请笑纳。
-Xms 设置初始化内存分配大小 默认占比系统的 64/1-Xmx 设置最大分配内存 默认占比系统的 4/1-XX:+PrintGCDetails 打印GC垃圾回收信息-XX:+HeapDumpOnOutOfMemoryError OOM Dump 文件
转载地址:http://mvqwi.baihongyu.com/