java依靠内存垃圾回收(GC),不需要手动释放对象。通过可达性分析判定垃圾,根据对象生命周期的不同使用不同的策略进行回收。
可达性分析
分析以GVRoot对象为起点的引用链,不在链上的对象为可回收对象。下面几种对象可作为GCRoot:
- 虚拟机栈局部变量表中引用的对象
- 方法区中静态引用指向的变量
- 存活状态中的线程对象
- native方法JNI引用的对象
GC算法
- 标记清除算法:可达性分析,不可达标记为垃圾对象,清除。
优点是简单,不需要移动对象;缺点是需要停止组件运行,产生内存碎片 - 复制算法:内存分区,将存活对象复制到另一分区
优点是实现简单高效,无内存碎片;缺点是可用内存缩小为一半,对象存活率高时频繁复制; - 标记压缩算法:将存活对象,移动到内存一端
优点是没有减小可用内存,无内存碎片,性价比高;缺点是需要局部对象移动,降低效率
JVM分代回收策略
根据对象生存周期的不同,将对象存放在不同的分区,新生代及老年代,新生代采用复制算法,老年代采用标记压缩算法,提高效率。
新生代又分为Eden、survivor0及survivor1分区,Eden满触发GC,存活对象复制到S0,再次触发GC复制到S1,S0及S1来回交替,当存活对象在一定次数的GC后依然存活,放到老年区;
新生代 的 GC 叫作 Minor GC。因为 Java 对象大多都具备朝生夕灭的特性,所以 Minor GC 非常频繁,一般回收速度也比较快。
老年代 GC 也叫作 Major GC 或者 Full GC。当出现了 Major GC,经常会伴随至少一次的 Minor GC。
引用类型
强:不会回收内存
软:内存实在不够会回收
弱:GC会回收
虚:不会影响对象生命周期
网友评论