JVM内存布局

  1. 虚拟机栈
  2. 堆
  3. 元空间
  4. 程序计数器
  5. 本地方法栈

虚拟机栈

堆

一般分为新生代和老年代,默认空间占比为1:2

新生代

又分为伊甸区(Eden)、S0、S1(Survive区*2),默认空间占比为8:1:1

  1. 伊甸区:用于在空间足够存储对象时,分配给对象
  2. Survive区:用于作为复制算法的存活对象复制目标

因为对象多为朝生夕死,GC时对象多被回收,仅少数对象需要保留,新生代一般使用复制算法进行垃圾回收,S0和S1交替作为SurviveFrom和SurviveTo区,作为复制的目标。
若该区域空间不足以存下存活对象,或对象存活次数超出了阈值(默认为15),对象将被移至老年代。

老年代

用于存储存活次数超过预期的长期对象,或新生代空间不足以分配的大对象

该区域对象存活率较高,通常使用标记-清除算法进行垃圾回收。

标记算法(可达性分析):三色标记算法等

元空间

程序计数器

本地方法栈

其他

  1. 堆外内存

参考文档

  1. https://mp.weixin.qq.com/s?__biz=MzAxODcyNjEzNQ==&mid=2247567048&idx=3&sn=57eccb5ec89c39c284f2adab41fb8201&chksm=9bd26b50aca5e2464014024fab7993831a7fadbf1529d6bf37c1b786a6027e413fc5c9deab72&scene=27