一.JVM堆内存结构
堆内存是所有线程共用的内存空间,JVM 将 Heap 内存分为年轻代(Young generation)和 老年代(Old generation, 也叫 Tenured)两部分。
年轻代还划分为 3 个内存池,新生代(Eden space)和存活区(Survivor space), 在大部分 GC 算法中有 2 个存活区(S0, S1),在我们可 以观察到的任何时刻,S0 和 S1 总有一个是空的, 但一般较小,也不浪费多少空间。
Non-Heap 本质上还是 Heap,只是一般不归 GC 管理,里面划分为 3 个内存池。 Metaspace, 以前叫持久代(永久代, Permanent generation), Java8 换了个名字叫 Metaspace。 CCS, Compressed Class Space, 存放 class 信 息的,和 Metaspace 有交叉。 Code Cache存放 JIT 编译器编译后的本地机器代 码。
二.JVM 栈内存结构
栈帧是一个逻辑上的概念,具体的大小在 一个方法编写完成后基本上就能确定。 比如返回值需要有一个空间存放,每个局 部变量都需要对应的地址空间,此外还有 给指令使用的操作数栈,以及 class 指针 (标识这个栈帧对应的是哪个类的方法, 指 向非堆里面的 Class 对象)。
三.JVM 内存结构
方法中使用的原生数据 类型和对象引用地址在栈上存储;如果是对象引用,则栈中的局部变 量槽位中保存着对象的引用地址, 而实际的对象内容保存在堆中。
对象、对象成员与类定义、静态变 量在堆上; 对象的成员变量与对象本身一起存 储在堆上, 不管成员变量的类型是 原生数值,还是对象引用。