美文网首页
jvm内存模型学习笔记

jvm内存模型学习笔记

作者: 森林中大鸟 | 来源:发表于2020-05-18 06:12 被阅读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

    方法区

    运行是常量池

    直接内存

    相关文章

      网友评论

          本文标题:jvm内存模型学习笔记

          本文链接:https://www.haomeiwen.com/subject/rsjyohtx.html