jvm内存模型学习笔记

2020-05-18  本文已影响0人  森林中大鸟

运行时区域

程序计数器

可以看作线程执行的字节码的行号指示器,记录执行的位置。字节码解释器通过改变计数器的值获取下一条要执行的指令。

Java虚拟机多线程是通过线程切换并分配处理器执行时间的方式实现的。因此,为了使线程切换后恢复到正确的执行位置,每个线程需要一各程序计数器,记录执行位置,单独存储,互不影响。

执行java方法:计数器记录的是正在执行的虚拟机字节码指令的位置

执行natvie方法:记录器为空(undefined)

属于线程私有内存,占用空间较小,不会出现OOM

java虚拟机栈

线程私有

生命周期与线程与线程相同

描述的是Java方法执行的内存模型,每个方法执行值会创建一个栈帧,用于存储 局部变量表,动态链接,方法出口,操作栈的等信息

每个方法被调用到执行完成的过程对应一个栈帧在虚拟机栈中入栈和出战的过程。

局部变量表存储编译期间可预知的基本数据类型(boolean,byte,short, int, char, float, long, double),对象引用(不等同于对象本身,可能是指向对象起始地址的引用指针,或者指向一个代表对象句柄或者其他与此对象相关的地址),和returnAddress类型(指向了一条字节码指令的位置)。

64位的long ,double类型的数据会占用两个局部变量的空间,其余数据类型只占用一个。

局部变量表所分配的内存空间在编译期间完成分配,进入一个方法时,这个方法需要在帧中分配多大的内存空间是完全确定的。方法运行期间, 不会改变局部变量表的大小。

线程请求的栈深度对于虚拟机所允许的深度时会出现栈溢出异常,如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时,会抛出OOM异常。

本地方法栈

和虚拟机栈类似,也会抛出栈溢出和OOM异常 。是为虚拟机执行natvie方法服务的,虚拟机栈为执行Java方法服务。

Java堆

虚拟机管理的内存中最大的一块

被所有线程共享

在虚拟机启动时创建

用于存放对象实例

垃圾回收器管理的主要区域

从分代垃圾回收算法的角度可分为老年代,新生代等

可处于物理上不连续的内存空间,可以时固定大小也可以是可扩展的(可扩展的通过-Xmx和-Xms空值)

如果没有内存可供实例分配,也不能扩展时会抛出OOM

方法区

运行是常量池

直接内存

上一篇下一篇

猜你喜欢

热点阅读