您的位置:首页 > 编程语言 > Java开发

Java内存区域与内存溢出异常

2018-01-08 16:13 162 查看
运行时数据区域:



运行时数据区的内存可以用上图表示,程序计数器是唯一不报内存错误的区域.其他比如方法区和堆会报OutOfMemoryError,本地方法栈和JVM栈即报OutOfMemoryError又报StackOverflowError错误.

程序计数器
程序计数器是一块比较小的内存空间,它的作用可以看做当前字节码的行号指示器.字节码解释器工作时就是通过改变程序计数器的值来选取下一条要执行的字节码指令.分支,循环,跳转,异常处理,线程恢复等基础功能都依赖这个程序计数器完成.
每个线程都有一个程序计数器.各个线程之间的程序计数器单独工作,互不影响.(是线程私有的内存,方便从其他线程切换回来后还可以正常的执行程序).
如果正在执行的是一个Java方法,它记录的就是正在执行的虚拟机的字节码地址.如果正在执行的是Native方法,这个计数器的值就为空.

Java虚拟机栈
也是线程私有的,生命周期与线程的生命周期相同.它描述的是Java方法执行的内存模型.

每个方法被执行时都会创建一个栈帧,(存储局部变量表,操作栈,动态链接,方法出口等信息).每一个方法从调用到执行完成就对应着入栈与出栈.
这个区域规定了2种异常:
1.当线程的调用栈深度超过了虚拟机允许的栈深度会抛出StackOverflowError异常
2.当无法申请到足够的内存的时候会抛出OutOfMemoryError异常

1.局部变量表:
它存放了基本数据类型和引用(reference)类型(根据虚拟机的不同它可能指向一个对象的真是地址,也有可能指向一个代表对象的句柄),还有returnAddress类型(指向了一条字节码指令的地址).

内存大小:它的内存计量单位是Slot(变量槽),long和double占2个Slot.其他的数据类型占一个Slot大小.局部变量表所需要的内存是在编译时期确定的,运行时期无法更改它的大小.

本地方法栈
与虚拟机栈很相似,但是它是Native的方法栈,本地方法栈也会抛出OutofMemory和StackOverflow异常.

Java堆
堆是存放内存中最大的一块,是线程间共享的.在虚拟机启动的时候创建,它的作用就是存放实例对象.是垃圾回收的主要区域,很多时候也被称作为GC堆.

根据虚拟机的要求,堆可以在物理上不连续,在逻辑上连续即可.当在堆中没有内存可以分配,会抛出OutOfMemoryError异常.

方法区
用于存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据.垃圾收集在这个区域比较少见.这个区域的内存回收目标主要是针对常量池的回收和类型的卸载.
当它无法满足内存分配的需求的时候会抛出OutOfMemoryError
1.运行时常量池
它是方法区中的一部分,Class文件中除了有类的版本,字段,方法,接口等还有一项信息就是常量池.用于存储编译时产生的字面常量和符号引用.类加载的时候,这部分内容会加载到运行时常量池中.
运行时常量还有一个特点就是具备动态性,运行时,也会将新的Class文件中的常量放入常量池中.
直接内存
直接内存是堆外内存,并不属于运行时内存,JDK1.4中新加入的NIO加入了基于通道(Channel)和缓冲区(Buffer)的IO方式,直接使用Native方式申请堆外内存,通过堆中的DirectByteBuffer对象作为这块内存的引用进行操作.可以提高性能(避免了在堆和Native堆中来回复制数据)

对象实例化分析

Object obj = new Object();
这段代码主要涉及到了3块内存,方法区,堆,虚拟机栈.当在方法体内,这句话会被反应到局部变量表中创建一个reference引用,
new Object()这部分会反应到堆中,形成了一块存储了Object类型的实例数据值的结构化内存.另外Java堆中还必须能查找到此对象类型数据等地址信息(比如对象类型,父类,实现的接口,方法等).这些类型数据则保存在方法区中.

通过栈中的reference引用访问堆中的对象有2种方式(根据虚拟机实现的不同有句柄和通过指针访问2种)

通过句柄的访问方式如下:



通过指针访问方式如下:



句柄方式的好处在于句柄的地址值是固定的,在对象被移动(GC经常伴随着对象的移动)的时候.对象实例的指针会被修改.通过指针的好处在于速度快,节省了一次指针定位的时间开销.

OutOfMemoryError

内存溢出的测试方法:



参考

深入理解Java虚拟机
http://blog.csdn.net/ns_code/article/details/17565503
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: