文档章节

-XX:HeapDumpOnOutOfMemoryError

小胖子编程
 小胖子编程
发布于 2017/08/30 22:53
字数 313
阅读 8
收藏 1

用法: -XX:+HeapDumpOnOutOfMemoryError 当堆抛出OOM错误时,dump出当前的内存堆转储快照。

举个栗子

public class OOM {

    static class OOMObject {

    }

    //-Xmx20M -Xms20M -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
    public static void main(String[] args) {
        List<OOMObject> list = new LinkedList<>();
        while(true) {
            list.add(new OOMObject());
        }
    }

}

这个例子很简单,就是不断创建OOMObject,加入到list中(为了让GC Roots到对象之间有可达路径,避免被GC),直到堆内存不够时,抛出OOM异常。

运行后,控制台打印信息

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid97312.hprof ... 
Heap dump file created [33684485 bytes in 0.424 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.gc.OOM.main(OOM.java:19)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

可以看到dump出了hprof文件可供分析,可以用MAT工具进行分析

用MAT打开后,可以看到分析情况

image.png

image.png

由此也可以知道,是因为list的容量过大而导致OOM,可以根据此来进行优化代码或者JVM参数。

如果是由内存泄漏导致的,也可以通过工具查看泄漏对象到GC Roots的引用链,就能进行相应的分析处理。

另一个与之相关联的参数: -XX:HeapDumpPath=/temp/ 该参数的含义是指定dump的文件目录

© 著作权归作者所有

共有 人打赏支持
小胖子编程
粉丝 1
博文 9
码字总数 9126
作品 0
绍兴
私信 提问
jvm诊断与优化(3)

jvm内存:如图从左到右依次为: [ (新生代)PSYoungGen:{ EdenS0(form)S1(to) } (老年代)ParOldGen:{ Old Memory} ] (方法区持久区)Perm -Xms120M 设置堆的初始大小120M -Xmx120M 设置堆最大的...

Canaan_
2016/04/22
37
0
tomcat 产生heapdump文件配置

系统有时会遇到OutOfMemoryError,Java堆溢出了。我们需要找到造成OutOfMemoryError原因。一般有两种情况: 1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收; 2、内存溢出,内存...

江江的喵
2015/12/17
453
0
org.gradle.jvmargs 在Gradle.Properties里的目的是什么?

Gradle.Properties里有个注释掉的行 org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 目的是什么?...

shikeaiDev
2014/09/14
12.9K
2
Gradle工程错误:Gradle sync failed: Java home is different

Gradle sync failed: Java home is different (1)错误描述 Gradle sync failed: The newly created daemon process has a different context than expected. It won't be possible to reco......

aa176
2017/04/16
0
0
IDEA15 idea64.exe.vmoptions optimization

-ea -server -Xms1g -Xmx1g -Xss16m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+UnlockExperimentalVMOptions -XX:+UseConcMarkSweepGC -X......

阿凡达纳
2015/11/29
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

vue 组件使用中的一些细节点

细节一 基础例子 运行结果: 以上大家都懂,这边就不多说,回到代码里,有时候我们需要 tbody 里面每一行是一个子组件,那我们代码可以怎么写呢?我们可以这样写,定义一个全局组件,如下: ...

peakedness丶
4分钟前
0
0
vue 之 css module的使用方法

动手之前先配置项目,网上很多文章说需要下载css-loader插件,Vue中的vue-loader已经集成了 CSS Modules,因此删掉也能正常运行 在vue.config.js中添加如下配置 `css: {``loaderOptions: ...

前端小攻略
7分钟前
0
0
Range Sum Query - Immutable(leetcode303)

Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive. Example: Given nums = [-2, 0, 3, -5, 2, -1]sumRange(0, 2) -> 1sumRa......

woshixin
18分钟前
0
0
「阿里面试系列」面试加分项,从jvm层面了解线程的启动和停止

线程的启动的实现原理 线程停止的实现原理分析 为什么中断线程会抛出InterruptedException 线程的启动原理 前面我们简单分析过了线程的使用,通过调用线程的start方法来启动线程,线程启动后...

James-
25分钟前
0
0
转换 bytes 为 kb/mb/gb/tb/pb…

智能转换 bytes 为 kb/mb/gb/tb/pb… 用到了 math 模块中的一些函数 #!/usr/bin/env python# -*- coding: utf-8 -*-"""智能转换 bytes 为 kb/mb/gb/tb/pb..."""import mathdef conv...

郭恩洲_OSC博客
32分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部