概述
本文目的
- 通过代码验证Java虚拟机规范中描述的堆中存储的内容
- 遇到内存溢出错误时
- 能根据异常的信息快速判断出是堆的溢出
- 出现此类问题后如何处理
操作
创建类
1 | package com.super2bai.jvm; |
设置虚拟机参数
右键单击类文件 -> Run As
-> Run Configurations...
1 | -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError |
运行结果
运行后,如果未指定dump文件路径,会在当前项目的根路径下生成名为java_pid*.hprof
的文件,如果没有此文件,F5
刷新当前项目。
Java堆内存的OOM异常是实际应用中常见的内存溢出异常情况。
当出现Java堆内存溢出时,异常堆栈信息
java.lang.OutOfMemoryError
会跟着进一步提示Java heap space
。
解决
一般的手段时通过内存映像分析工具(如·Eclipse Memory Analyzer·)对Dump出来的堆转储快进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow)。
Eclipse Memory Analyzer
其它
How to find and fix memory leaks in your Java application
日后有时间将会翻译并发布上面两篇文章
What is the difference between an OutOfMemoryError and a memory leak