判定对象是否可以回收的算法:
1.引用计数器 劣势 相互引用问题
2.可达性分析 GC Roots作为起始点,形成引用链。GC Roots对象包含几钟类型(虚拟机栈中引用的对象、方法区静态属性应用的对象、方法区中常量引用的对象、native方法引用的对象) Java选用
引用分类:
1.强引用 永远不会被回收
2.软引用 SoftReference标识,内存溢出之前进行二次回收
3.弱引用 WeakReference标识,下一次垃圾回收就回收。
4.虚引用 PhantomReference标识,直接回收并收到一个系统通知
finalize()方法,假如实例的类实现了该方法且并没有执行过该方法,那么在被标记为不可达之后会将对象放置到一个F-Queue中,由一个低优先级的Finalizer线程去执行finalize()方法,并且不保证改方法执行完毕。不建议使用。
方法区(Hotspot中的永久代)回收问题: 方法区主要回收废弃常量和无用的类,暂不深入分析。
垃圾回收算法:
1.标记清除 标记需要回收的对象,同一回收。劣势 效率和内存碎片化
2.复制算法 基本思路是分成两块 使用一块 将存活的复制到另一块,清理掉其他的。Hotspot新生代的优化思路是一块Eden和两块Survivor,8:1,使用一块Eden合一块Survivor。Survivor不够用时分配对象到老年代。
3.标记-整理 标记 回收时向一段移动,清理掉其他。老年代算法。
OopMap辅助寻找GC Roots,枚举根节点、安全点问题、安全区域问题待再次探讨。
新生代垃圾回收器:
1.Serial 单线程,必须暂停其他线程
2.ParNew Serial的多线程版本
3.Parallel Scavenge
老年代垃圾回收器:
1.CMS
2.Parallel Old
3.Serial Old
全年代: G1
日志理解:
内存分配与回收策略:待细致分析