《深入理解Java虚拟机》读书笔记4-运行时内存区域
Java运行时数据区域
Java运行时数据区域如下图所示:

- l 程序计数器:较小的内存空间,当前程序所执行的字节码的行号指示器。如果执行一个java方法,计数器记录正在执行的虚拟机字节码指令地址;如果执行native方法,计数器为空。
- l 虚拟机栈:线程私有的,java方法执行内存模型。存储局部变量表、操作数栈、动态链接、方法出口等。线程请求的栈深度大于虚拟机允许的深度则抛出stackOverflowError;若虚拟机能够动态扩展,在扩展时无法申请到足够的内存抛出OutOfMemoryError。
- l 本地方法栈:类似虚拟机栈,只是本地方法栈是为native方法服务。类似虚拟机栈。
- l Java堆(GC堆):所有线程共享,在虚拟机启动时创建,存放对象实例以及数组。当对象实例没有内存分配了,堆无法扩展则抛出OutOfMemoryError。
- l 方法区(Non-Heap非堆):所有线程共享,存储已被虚拟机加载的类信息、常量、静态变量(有的说法时再jdk7中为了移除永久代,把静态变量放到了Class对象中https://www.zhihu.com/question/59174759 )、及时编译器编译后的代码等,内存不足时抛出OutOfMemoryError。
- l 运行时常量池:方法区的一部分,存放编译期生成的各种字面量和符号引用。

浙公网安备 33010602011771号