读书笔记-深入理解JVM虚拟机-1.OOM初探
2023-09-11 14:20:45 时间
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问题
相关文章
- java虚拟机学习-JVM调优总结-分代垃圾回收详述(9)
- java虚拟机学习-JVM调优总结(5)
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
- 虚拟机系列 | JVM运行时数据区
- 虚拟机系列 | JVM类加载机制
- 基于Node.js的Java虚拟机:node-jvm
- JVM的重排序
- HotSpot JVM常用参数(选项)设置
- JVM调优
- Java虚拟机(JVM)调优思路
- Hotspot JVM的常用选项
- JVM探究 面试题 JVM的位置 三种JVM:HotSpot 新生区 Young/ New 养老区 Old 永久区 Perm 堆内存调优GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数法
- JVM知识总结-运行时区域划分
- 深入理解Java虚拟机:JVM高级特性与最佳实践
- JVM内存结构
- 深入理解JVM虚拟机读书笔记——垃圾回收器
- 使用Java visualVM监控远程JVM
- java虚拟机JVM
- JVM系列之:Contend注解和false-sharing
- JVM详解之:运行时常量池
- 面试突击(六)——JVM如何实现JAVA代码一次编写到处运行的?
- JVM里对象的布局和结构和访问
- JVM线程状态Running、Sleeping、Wait、Park、Monitor