首页 > 代码库 > 读书笔记-深入理解JVM虚拟机-1.OOM初探
读书笔记-深入理解JVM虚拟机-1.OOM初探
Java堆OOM(Out-Of-Memory)异常
执行例如以下程序,爆出异常 java.lang.OutOfMemoryError: Java heap space
分析:
1.内存配置
-Xms20m 堆的大小是20M
-Xmx20m 堆最大能够扩展到20M,因为堆的大小本来就是20M 所以该堆不能够扩展
-XX:+HeapDumpOnOutOfMemoryError 当出现OutOfMemory异常的时候导出堆文件
OOMObject用来占用空间,用一个List来存储OOMObject以保证我们每一个生成的OOMObject对象能够和GCRoot引用链连接起来
这种话就会导致OOM异常。由于每一个对象都是实用的(都是能够和GCRoot连接起来的)
分析OOM问题的一般过程例如以下
1.发生OOM了
2.推断发生OOM的位置的对象是否应该是该存活的
3.假设OOM位置的对象是不应该存活的并且发生了OOM异常,那就是我们的程序写的有问题
4.假设OOM的位置的对象是应该存活的可是却发生了OOM异常,那我们就应该适当调整JVM參数了
关于当前这个样例:
非常明显我们用的是死循环一直创建对象,而且用List保存持有对象的实例,导致了JVM无法回收创建的对象,所以产生了OOM问题
执行例如以下程序,爆出异常 java.lang.OutOfMemoryError: Java heap space
/** * VM Args:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * @author zzm */ public class HeapOOM { static class OOMObject { } public static void main(String[] args) { List<OOMObject> list = new ArrayList<OOMObject>(); while (true) { list.add(new OOMObject()); } } }
分析:
1.内存配置
-Xms20m 堆的大小是20M
-Xmx20m 堆最大能够扩展到20M,因为堆的大小本来就是20M 所以该堆不能够扩展
-XX:+HeapDumpOnOutOfMemoryError 当出现OutOfMemory异常的时候导出堆文件
OOMObject用来占用空间,用一个List来存储OOMObject以保证我们每一个生成的OOMObject对象能够和GCRoot引用链连接起来
这种话就会导致OOM异常。由于每一个对象都是实用的(都是能够和GCRoot连接起来的)
分析OOM问题的一般过程例如以下
1.发生OOM了
2.推断发生OOM的位置的对象是否应该是该存活的
3.假设OOM位置的对象是不应该存活的并且发生了OOM异常,那就是我们的程序写的有问题
4.假设OOM的位置的对象是应该存活的可是却发生了OOM异常,那我们就应该适当调整JVM參数了
关于当前这个样例:
非常明显我们用的是死循环一直创建对象,而且用List保存持有对象的实例,导致了JVM无法回收创建的对象,所以产生了OOM问题
读书笔记-深入理解JVM虚拟机-1.OOM初探
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。