读书笔记-深入理解JVM虚拟机-1.OOM初探

Java堆OOM(Out-Of-Memory)异常

执行例如以下程序,爆出异常 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问题

时间: 2024-08-10 23:28:01

读书笔记-深入理解JVM虚拟机-1.OOM初探的相关文章

读书笔记-深入理解JVM虚拟机-1.JVM-Stack造成的OOM的理解

-Xss128k:这个JVM参数用来配置栈的大小为128k 因为栈是线程私有的(不清楚的可以去了解下JVM虚拟机结构),所以如果我们启动一个线程,并且在这个线程中调用一个递归,就会产生该异常. /** * VM Args:-Xss128k * */ public class JavaVMStackSOF { private int stackLength = 1; public void stackLeak() { stackLength++; stackLeak(); } public sta

[转][读书笔记]深入理解java虚拟机

原文地址:http://blog.csdn.net/hanekawa/article/details/51972259 第二章 Java内存区域与内存溢出异常 一,运行时数据区域: 1.        程序计数器:当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一跳需要执行的字节码指令.如果执行的是native方法,这个计数器的值则为空. 2.        Java虚拟机栈 线程私有,生命周期与线程相同.描述的是java方法执行的内存模型:每个方法在执行

《深入理解JVM虚拟机》读书笔记

前言:<深入理解JVM虚拟机>是JAVA的经典著作之一,因为内容更偏向底层,比较枯燥难啃,所以之前一直没有好好的阅读过.最近因为刚好有空,又有了新目标.所以打算和<构架师的12项修炼>一起看,这样荤素搭配,吃饭不累~ 笔记: 1.如果开发人员不了解虚拟机的一些技术特性的运行原理,就无法写错最适合虚拟机运行和自优化的代码. 2. 原文地址:https://www.cnblogs.com/xujanus/p/8513587.html

【读书笔记::深入理解linux内核】内存寻址

我对linux高端内存的错误理解都是从这篇文章得来的,这篇文章里讲的 物理地址 = 逻辑地址 – 0xC0000000:这是内核地址空间的地址转换关系. 这句话瞬间让我惊呆了,根据我的CPU的知识,开启分页之后,任何寻址都要经过mmu的转换,也就是一个二级查表的过程(386) 难道内核很特殊,当mmu看到某个逻辑地址是内核传来的之后,就不查表了,直接减去0xC0000000,然后就传递给内存控制器了??? 我发现网上也有人和我问了同样的问题,看这个问题 这句话太让人费解了,让人费解到以至于要怀疑

进入JVM的世界:《深入理解JVM虚拟机》-- 思维导图

进入JVM的世界:<深入理解JVM虚拟机>-- 思维导图 在工作的时候,其实很少会需要使用到JVM的时候,因而一直都是零零散散的看了些JVM的知识.于是便抽空看了一下这本神书,阅罢,醍醐灌顶.豁然开朗.真正的是知其然,更知其所以然.当然,看完了书,知识还不是自己的,只有留在自己的脑袋里面的,才是自己的.因此我整理了一份思维导图,希望自己有时间的时候,就多看看,多想想.巩固记忆. 大图地址:https://img2018.cnblogs.com/blog/785907/201901/785907

深入理解JVM虚拟机开篇:JVM介绍与知识脉络梳理

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指

20150206读书笔记&lt;深入理解计算机系统&gt;

●第一章 C是系统级编程的首选.C++显示支持抽象,属于应用级程序设计语言. 简单例子: 一个典型系统的硬件组成: 存储器的层次结构: 注:存储器层次结构的设计思想是,该层存储器作为下一层存储器的高速缓存 总结:计算机系统的一个重大主题就是提供不同层次的抽象表示,来隐藏实际实现的复杂性.  操作系统内核是应用程序和硬件之间的媒介.提供3个基本的抽象: (1)文件是对I/O设备的抽象 (2)虚拟存储器是对主存和磁盘的抽象 (3)进程是对处理器,I/O设备和主存的抽象. 虚拟机是对整个计算机(操作系

深入理解JVM虚拟机6:深入理解JVM类加载机制

深入理解JVM类加载机制 简述:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 下面我们具体来看类加载的过程: 类的生命周期 类从被加载到内存中开始,到卸载出内存,经历了加载.连接.初始化.使用四个阶段,其中连接又包含了验证.准备.解析三个步骤.这些步骤总体上是按照图中顺序进行的,但是Java语言本身支持运行时绑定,所以解析阶段也可以是在初始化之后进行的.以上顺序都只是说开始的顺序,实际过

深入理解JVM虚拟机4:Java class介绍与解析实践

微信公众号[Java技术江湖]一位阿里 Java 工程师的技术小站.作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux.网络.多线程,偶尔讲点Docker.ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!(关注公众号后回复”Java“即可领取 Java基础.进阶.项目和架构师等免费学习资料,更有数据库.分布式.微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南.Java程序员面试指