zoukankan      html  css  js  c++  java
  • jvm内存溢出问题的定位方法

    jvm内存溢出问题的定位方法

    今天给大家带来JVM体验之内存溢出问题的定位方法。
    废话不多说直接开始:

    一、Java堆溢出

    测试代码如下:

    import java.util.*;
    public class A {
    	public static void main(String[] args) {
    		List<String> strList = new ArrayList<>();
    		while(true) {
    			strList.add("");
    		}
    	}
    }
    

    运行过程如下所示:

    我们在这里可以看到内存在不断的上涨,而Java在到一定时候会爆出OOM异常。
    如下:

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3210)
    at java.util.Arrays.copyOf(Arrays.java:3181)
    at java.util.ArrayList.grow(ArrayList.java:265)
    at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:239)
    at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:231)
    at java.util.ArrayList.add(ArrayList.java:462)
    at A.A.main(A.java:9)

    现在程序是很简单,不过如果在大型项目里爆了堆溢出可就麻烦了。
    我们很难通过代码定位。
    所以我们需要用工具对其分析。


    二、堆内存快照

    我们先对Eclipse进行运行配置。


    参数如下所示
    -XX:+HeapDumpOnOutOfMemoryError -Xms20m -Xmx20m
    运行结果如下:

    随后我们找到项目地址,我们会发现在Project本目录中出现了个hprof文件


    至此我们就把堆内存快照保存下来了。


    三、分析

    我们这里需要一个工具叫MAT是Eclipse提供的分析工具。

    这里是链接我们选择清华的镜像

    https://mirrors.tuna.tsinghua.edu.cn/eclipse/mat/1.9.0/rcp/MemoryAnalyzer-1.9.0.20190605-win32.win32.x86_64.zip

    解压后运行

    这里运行会很慢,需要等待很久。打开后如下所示。

    用这个工具把我们之前dump下来的东西放进去

    点开dominator_tree,我们会发现问题储在main线程里,


    这里有俩参数,一个是Shallow Heap,另一个是Retained Heap

    shallowHeap Retained Heap
    对象本身占用的内存大小 对象本身占用的大小+对象引用的大小总和

    常规理解就是如果我们对其做GC,那么就会释放掉这么大的内存。

    而其中的这个Object对象就是我们之前创建的String类

    至此我们就完成了对内存错误的定位。

  • 相关阅读:
    JAVA基础——编程练习(二)
    JAVA基础——面向对象三大特性:封装、继承、多态
    JVM内存
    50. Pow(x, n) (JAVA)
    47. Permutations II (JAVA)
    46. Permutations (JAVA)
    45. Jump Game II (JAVA)
    43. Multiply Strings (JAVA)
    42. Trapping Rain Water (JAVA)
    41. First Missing Positive (JAVA)
  • 原文地址:https://www.cnblogs.com/godoforange/p/11544004.html
Copyright © 2011-2022 走看看