JVM的内存区域划分

Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。

JVM的内存区域划分

Java程序执行流程

  1. Java源代码文件(.java)会被Java编译器(Java Compiler)编译成Java字节码文件(.class)
  2. 然后由JVM(Java虚拟机)中的类加载器(Class Loader)加载各个类的Java字节码文件(.class);加载完后,交由JVM(Java虚拟机)的执行引擎(Execution Engine)执行。
  3. 在整个程序执行过程中,JVM会用一段空间(Runtime Data Area(运行时数据区),即是常说的JVM内存)来存储程序执行期间需要用到的数据和相关信息;在Java中常说的内存管理,即是对Runtime Data Area(运行时数据区)进行管理(如何分配和回收空间)。

运行时数据区的每部分存储哪些数据

程序计时器(Program Counter Register)
  1. 程序计时器(Program Counter Register)是一块较小的内存空间,可以看做是当前线程所执行的字节码行号的指示器。
  2. 字节码解释器工作时,通过改变计数器的值选取下一条执行的字节码指令;(一些基本功能都需要依赖计数器来完成,如分支、循环、跳转、异常处理、线程恢复等)。
  3. Java虚拟机多线程是通过线程间轮流切换来分配给处理器执行时间;在确定时间节点,一个处理器(一核)只会执行一个线程的指令;为保证 线程切换 回来后能恢复到原执行位置,各个线程间计数器互相不影响,独立存储(称之为线程私有的内存)。
  4. 如果线程执行的是非native方法,程序计数器 记录正在执行的虚拟机字节指令地址;如果执行native方法,计数器值为空 undefined。
  5. 由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。
Java 栈 (Java Vitual Machine Stack)
  1. Java栈是Java方法执行的内存模型。
    JVM的内存区域划分
本地方法栈 (Native Method Stack)
堆(Heap)
方法区(Method Area)