第二章:Java内存区域和内存溢出异常
2.2运行时数据区域
运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器
方法区和堆是线程共享的区域
虚拟机栈,本地方法栈,程序计数器是数据隔离的数据区
2.2.,程序计数器,即PC,本质是一块较小的内存区域.可以看做当前线程所执行的字节码的行号指令器
有了它可以实现字节码指令,分支,循环.跳转.异常处理,线程恢复
每个线程有一个单独的PC,各个线程之间不互相影响,独立存储
如果执行的方法是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址
如果是native方法,即不是java语言实现的方法,计数器为空
这是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryException情况的区域
2.2.2java虚拟机栈
Java虚拟机栈也是线程私有的,它的生命周期与线程相同
它描述的是java方法执行的内存模型:每个方法执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,放大出口灯信息.,每个方法从调用到执行完成的过程,就对应着一个栈帧入栈到操作的过程
局部变量表存放了编译器可知的各种基本数据类型(Boolean,byte,char等),对象引用,即reference类型(可能指向一个对象其实地址的引用指针,也可能是指向一个代表对象的句柄或者其他和此对象相关的位置),和returnAddress类型(指向了一个字节码的地址)
*Error,发生在线程请求的栈深度大于虚拟机所允许的深度的时候
OutOfMemoryError,无法在扩展内存的时候发生
本地方法栈:
跟虚拟机栈的作用一样,不过虚拟机栈运行java方法,而本地方法栈则运行Native服务
本地方法栈中使用的语言,数据结构等没有强制规定,有具体的虚拟机去实现它
Java堆
Java 堆是所有线程共享的一块内存区域,他的唯一作用就是存放实例化的对象,所以他是垃圾收集器的主要作用区域,
Java可以细分为新生代和老年代
更细致的分法”
Eden空间
From survivor空间
To survivor空间
从内存分配的角度还可以分为多个线程私有的分配缓冲区
无论怎么划分都和存放内容无关,存储的都是对象实例,进一步划分的目的是为了更好的回收内存