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虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
- 如果线程请求深度大于虚拟机栈所允许的深度,将抛出StackOverflowError异常。
4.程序计数器(PC Register)
- 很小一块内存空间,存储当前线程所执行字节码的位置。
- 线程私有的【线程安全】(每个线程必须有一个独立的程序计数器)。
5.本地方法栈(Native Method Stacks)
- 线程私有的【线程安全】,他的生命周期与线程相同。
- 为虚拟机使用到的本地方法服务。
- 如果线程请求深度大于虚拟机栈所允许的深度,将抛出StackOverflowError异常。