堆内存
老年代占堆内存总大小的2/3,新生代1/3 ,Eden占新生代总大小的8/10,Survivor区的Form和To各占1/10
堆用来存放对象,新建的对象都会放入Eden区域,Eden占满了触发minor gc,字节码执行引擎执行垃圾回收,根据可达性算法回收垃圾,垃圾回收之后存活下来的对象放入Survivor的Form区域,对象的分代年龄+1(分代年龄存放在对象的Object Header中),第二次垃圾回收,清理Eden和Form区域,把Eden和Form存活的对象放入To区域。Form和To总有一块是空的,来回拷贝(使用复制算法)。
经历15次GC还存活的对象会被放入老年代(线程池,缓存对象,spring bean等)
可达性算法:先找到所有的GC ROOTS 根(局部变量/静态变量/本地方法栈等)作为起点,向下搜索引用的对象,找到的对象都标记为非垃圾对象。
老年代占满后触发full gc(回收堆和方法区),full gc会停掉应用线程(STW 咋瓦鲁多)。
对象分代年龄,锁状态等都存放在对象头中。