《深入理解java虚拟机》之垃圾回收

来源:互联网 发布:淘宝找回密码系统繁忙 编辑:程序博客网 时间:2024/05/17 09:29
判断对象存活        引用计数算法(弃用,难以解决循环引用)        可达性分析算法(GC Roots对象向下搜索)        (如果对象没有与GC Roots相连的引用链,它会被标记,然后执行finalize()筛选,当对象没有覆盖finalize()方法,        finalize()方法被虚拟机调用过,该对象被回收。finalize()方法里只要使得该对象与引用链上对象关联。引用垃圾回收级别(内存紧张时,存活的对象也回收)        强引用(不会被回收)        软引用        弱引用        虚引用回收方法区        废弃常量        无用的类(三个条件:java堆不存在该类实例,加载该类的类加载器被回收,该类Class反射对象没有被引用)GC算法        标记-清除算法(效率低,产生不连续的碎片)        复制算法(内存缩小为原来一半,对象存活率高时复制操作就多,效率变低。改进:将内存分为Eden, from Survivor, to Survivor)        标记-整理算法        分代收集算法(新生代采用复制算法,老年代采用标记-清除或整理算法)可达性分析算法问题        GC Roots查找引用消耗时间        枚举根节点停顿,防止引用关系变化        (解决方法:准确式GC,通过OopMap直接得知对象引用地址。在线程跑到安全点Safepoint才GC        GC停顿怎样使得线程到安全点                抢占式中断                主动式中断        程序不执行时无法主动跑到安全点:安全区域)   垃圾收集器        Serial收集器(单线程、Client模式下默认新生代收集器)        ParNew收集器(多线程、Server模式下默认新生代收集器)        Parallel Scavenge收集器(多线程,复制算法新生代收集器)        Serial Old收集器(单线程,标记-清除算法老年代收集器)        Parallel Old收集器(多线程,标记-整理算法老年代收集器)        CMS收集器(多线程,标记-清除算法,以最短停顿时间为目标)内存分配与回收策略        对象有先在Eden分配        大对象直接进入老年代(典型大对象:很长的字符串及数组。原因:避免在Eden与两个survivor区复制)        长期存活的对象将进入老年代(对象年龄计数器,Eden中对象在1次GC后存活就移到Survivor中,15次就移到老年代)        动态对象年龄判定(如果Survivor中相同年龄对象大小总和大于Survivor一半,大于等于该年龄的对象直接进入老年代)        空间分配担保(新生代使用复制收集算法,使用一个Survivor作为备份,当大量对象在GC后存活,        就要老年代担保,将Survivor无法容纳的对象移到老年代。而多少对象在GC后存活无法知道,        就取经验值,与老年代空间比较,决定是否进行Full GC(老年代内的GC))
0 0
原创粉丝点击