java内存区域初窥

运行时数据区域

jvm.png

程序计数器

程序计数器 (Program Counter Register) 是一块较小的内存空间,能够看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型(各类虚拟机可能会经过更高效的字节码去实现)里,字节码解释器工做时就是经过改变这个计算器的值来选取 下一条须要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都须要依赖这个计数器来完成。java

  • 每条线程都须要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。线程私有。jvm

  • 线程执行的是一个java方法,计数器记录的是正在执行的虚拟机字节码制定地址。spa

  • 线程执行的是一个native方法,这个计数器值则为空(undefined)。线程

  • 惟一一个不会出现OutOfMemoryError状况的区域。对象

java虚拟机栈

java虚拟机栈 (Java Virtual Machine Stacks) 描述的是java方法执行的内存模型,每一个方法在执行的同时都会建立一个栈帧用于存储局部变量表、操做数栈、动态链接、方法出口等。接口

  • 线程私有,生命周期与线程相同生命周期

  • 若是线程请求的栈深度大于虚拟机所容许的深度,将抛出StackOverflowError异常内存

  • 若是虚拟机栈能够动态扩展,若是扩展时没法申请到足够的内存,则将抛出OutOfMemoryError异常rem

本地方法栈

与java虚拟机栈所发挥的做用很是类似,本地方法栈 (Native Method Stack) 是为虚拟机所使用的native方法服务。编译器

java堆

通常来讲,java堆 (Java Heap) 是java虚拟机所管理的内存最大的一块,此区域的惟一目的就是存放对象实例,几乎全部的对象实例都在这里分配内存。

  • 全部线程共享的内存区域

  • 垃圾收集器管理的主要区域(GC堆),还能够细分为新生代和老年代或者Eden空间、From Survivor空间和to Survivor空间

  • java堆能够处于物理上不连续的内存空间中,只要逻辑上连续的便可(可经过-Xmx和-Xms控制大小)

方法区

方法区(Method Area)是用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

  • 线程共享

运行时常量

运行时常量是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各类字面量和符号引用,这部份内容将在类加载后进入方法区的运行时常量池中存放。

相关文章
相关标签/搜索