学习笔记——JVM(1)运行时数据区(JVM内存模型)

JVM(1)

JVM运行时数据区

学习笔记——JVM(1)运行时数据区(JVM内存模型)

1.方法区(Method Area)(JDK1.7:PermSpace永久代)(JDK1.8:MetaSpace元空间)

  • 方法区只有一个,线程共享的内存区域【线程不安全】,生命周期和虚拟机是一样的。
  • 方法区中存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存。
  • 【逻辑上属于堆的一部分】,垃圾回收一般不讨论方法区的垃圾回收。
  • 内存不够抛出OutOfMemoryError(OOM)。

2.堆(Heap)

  • 堆只有一个,线程共享的内存区域【线程不安全】,生命周期和虚拟机是一样的。
  • 存储所有对象实例以及数组。
  • 内存不够抛出OutOfMemoryError(OOM)。

3.Java虚拟机栈(Java VM Stack) 

  • 线程私有的【线程安全】,他的生命周期与线程相同。
  • 虚拟机栈是java方法执行的线程内存模型:每个方法被执行的时候,java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
  • 如果线程请求深度大于虚拟机栈所允许的深度,将抛出*Error异常。

4.程序计数器(PC Register)

  • 很小一块内存空间,存储当前线程所执行字节码的位置。
  • 线程私有的【线程安全】(每个线程必须有一个独立的程序计数器)。

5.本地方法栈(Native Method Stacks)

  • 线程私有的【线程安全】,他的生命周期与线程相同。
  • 为虚拟机使用到的本地方法服务。
  • 如果线程请求深度大于虚拟机栈所允许的深度,将抛出*Error异常。