提示:参考深入理解java虚拟机
前言
上一篇文章概述了Java运行时的数据区域划分,其中Java堆是用来存储对象实例的,所以只要不停的创建对像,然后保证GCRoot到对象间有可达路径,这样就可以避免垃圾回收机制回收掉你创建的对象,就可以造成堆空间不停缩小,到达容量限制,产生OOM
一、参数设置
主要参数: -Xms20M -Xmx20M 最大最小堆容量都是一样的就是不可拓展堆
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:+HeapDumpOnOutOfMemoryError
二、代码实现
import java.util.ArrayList;
import java.util.List;
/**
* @author jc
*/
public class ObjectVMTest {
static class OOMobject{}
public static void main(String[] args) {
List<OOMobject> list = new ArrayList<>();
while (true) {
list.add(new OOMobject());
}
}
}
结果
处理方法
处理方法一般通过内存映像分析工具
首先确认是内存泄漏还是内存溢出
- 内存泄漏:
通过工具查看泄漏对象到GCRoot的引用链,找到这个对象是怎么样的引用路径导致垃圾回收器不能回收的。最重要的是定位对象位置,找到问题的具体代码
- 内存溢出:
就是对象都是必须存活的,就要调参数,就是前面我们用来设置堆最大和最小的参数,对比实际的机器内存看能不能再调高一点,然后还可以调整优化算法,看看存储结构合不合理,还有对象生命周期,能不能减少对象的存活时间,就是围绕减少内存消耗来做事情