- 对象的创建:类加载检查(没加载则加载)——分配内存——初始化——设置对象头——执行init方法
- 分配内存(指针碰撞【内存规整】:分界指针挪动对象大小的过程;空闲列表:表中分配一个可容纳对象的内存并更新)
- CAS多线程抢一个内存,未抢到的继续重试;TLAB本地线程分配缓冲,给线程提前分配内存,分区进行
- 减少临时对象给堆的GC造成的压力:通过逃逸分析(分析作用域,是否外部调用的,线程结束即销毁),不会逃逸的分配给栈
- 标量替换:解决没有足够大的内存存放对象,将对象分解为若干成员变量存放的过程
- 大对象直接进入老年代,具体多大可通过jvm参数设置
- 对象动态年龄判断:一批对象总大小>50%Surviver区,Surviver中对象>max(这批对象中最大的一个对象),直接老年代
- 如果老年代空间不足年轻代直接触发minorGC,担保机制(是否大于之前每次回收到老年代的平均大小,判断是否直接fullGC),回收到老年代空间不足触发fullGC,还是不足OOM
- 判断对象能否被GC:引用计数法(两个对象的成员变量相互引用);可达性分析算法
- java四种引用类型:强(直接new)、弱、软(newSoft(new)【GC不足直接干掉】)、虚
- finalize()方法:GC前执行finalize()方法