java虚拟机内存模型

java虚拟机所管理的内存包括以下几个运行时的数据区

java内存模型概念图:

java虚拟机内存模型_第1张图片

(一)程序计数器(线程私有)

  1. 是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器
  2. 一个处理器都只会执行一条线程的指令,故每条线程都需要有一个独立的程序计数器,各个线程之间的计数器互不影响,独立存储,这类内存区域为“线程私有”都内存
  3. 执行java方法,则计数器记录字节码指令地址,执行native方法,记录值为空
  4. 虚拟机中惟一一个在规范中未规定任何outofmemoryerror的区域

(二)java虚拟机栈(线程私有)----------执行java方法

  1. 虚拟机展栈描述的是java方法执行的内存模型,每个方法执行时都会创建一个栈帧,存储 局部变量表、操作数栈、动态链接、方法出口等
  2. 会抛出两种异常:
  • 线程请求栈深度大于虚拟机所允许的深度,抛出stackoverflowerror异常
  • 无法动态扩展申请到足够的内存,抛出outofmemoryerror异常

(三)本地方法栈(线程私有)----------执行native方法

  • 其余与(二)中相同

(四)java堆

  1. 是虚拟机所管理的内存中最大的一块
  2. 被所有线程共享
  3. 存放对象实例
  4. 是垃圾收集管理的主要区域
  5. java堆可分为新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样分类只是为了更好的回收内存。

(五)方法区

  1. 存储已被虚拟机加载的类信息,常量,静态变量,即时编译后的代码等
  2. 无法满足内存分配需求时,抛出outofmemoryerror异常
  • 运行时常量池:方法区的一部分 ,可以将运行期的新的常量放入池中,如string类中的intern()方法

对比:class文件常量池:存放编译期生成的各种字面量和符号引用

你可能感兴趣的:(java虚拟机内存模型)