深入理解java虚拟机读书笔记--java内存区域和管理

时间:2024-01-17 11:16:38

第二章:Java内存区域和内存溢出异常

2.2运行时数据区域

运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器

方法区和堆是线程共享的区域

虚拟机栈,本地方法栈,程序计数器是数据隔离的数据区

深入理解java虚拟机读书笔记--java内存区域和管理

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空间

从内存分配的角度还可以分为多个线程私有的分配缓冲区

无论怎么划分都和存放内容无关,存储的都是对象实例,进一步划分的目的是为了更好的回收内存