OutOfMemoryError(OOM)异常分析

1. Java堆异常

不断创建新对象,而没有被GC回收,则出现该错误 OutOfMemoryError: Java Heap Space

package jvm.test;

import java.util.ArrayList;

import java.util.List;

/**

* Created by Kaiming Wan on 2015/11/3 0003.

*

* VM Args: -Xms20m -Xmx20m -XX:+HeapDumpOutOfMemoryError

*

* 避免堆自动扩展,设置最小堆等于最大堆等于20m,设置-XX:+HeapDumpOutOfM......

深入理解Java虚拟机第二章:虚拟机对象

1.概览

HotSpot是JAVA最流行,用的最多的虚拟机。一般我们说java虚拟机也都指的是HotSpot虚拟机。

2.使用new对象创建的过程

检查常量池能否找到

检查是否有必要加载类

指针碰撞——移动分界指针(该指针区分了空闲和非空闲内存)或者空闲列表——用列表来记录内存状态。不同收集器采用的方式不同

初始化值(可以再TLAB中提前准备好)

设置元数据、哈希码、分代信息等,保存到类头部

6.调用方法按照程序员的意愿初始化对象实例

优化:为了避免堆资源的竞争,可以在堆区域预留一块本地线程分配缓冲(TLAB),需要分配直接从这里面去,这样可以保证原子性。......

深入理解Java虚拟机第二章:运行时数据区域

1 运行时数据区域

1.1 程序计数器

用于寻找下一条需要执行的字节码指令

线程隔离的数据区,保存每个线程自己的信息,用于现场恢复

执行Naive方法,计数器值为空

1.2 Java虚拟机栈

线程私有:和线程生命周期相同

为java方法提供字节码服务

是Java方法执行的内存模型:在执行方法时创建一个栈帧,存放局部变量表、操作数栈、动态链接方法出口等信息。

......