1. 判断对象是否存货算法
引用计数算法
根搜索算法:
通过一系列GC Roots为起始点进行向下搜索, 建立 引用链, 当一个对象不属于任意一个引用链时, 则判定对象不可用.
Java中可作为GC Roots的对象有:
Java虚拟机栈中的引用对象
本地栈中的引用对象
方法区中类静态属性引用的对象
方法区中的常量引用对象
2. 引用的几种类型:
Java中引用可分为: 强引用(Strong Reference), 软引用(Soft Reference), 弱引用(Weak Reference), 虚引用(Phantom Reference).
强引用: 只要存在有强引用, 则对象不会被垃圾收集器回收
软引用: 系统将在发生内存溢出之前, 将这类引用对应的对象列入回收范围进行二次回收, 如果二次回收后还没有足够的内存, 才抛出内存泄漏异常.JDK1.2后使用SoftReference实现软引用
弱引用: 该类引用对象的生存期在两次垃圾回收之间, 当发生垃圾回收时会将只有弱引用的对象回收.对应WeakReference类
虚引用: 该类引用即不影响对象被垃圾收集器回收, 也不能通过该类引用获得指向的对象, 其作用仅为在引用对象被回收之前发送一个系统通知.对应PhantomReference类.
3. 对象回收:
进行对象回收一般要经历两次标记
执行根搜索算法后, 对不属于任何引用链的对象, 将进行第一次标记, 并进行一次筛选.筛选的过程为判断对象是否重载finalize方法或其finalize方法是否已经被执行过并依此判断是否需要执行对象的finalize方法.
当判断对象需要执行其finalize方法时, 将对象置于F-Queue中等待执行, Java中建立一的低优先级Finalizer线程执行F-Queue队列中的方法
在finalize方法中可以通过重新简历对象与引用链中的对象的引用关系来避免对象的死亡.
4. 方法区回收:
常量池中常量对象回收:类似于对象回收
无用类回收:
判定无用类条件:
该类所有对象实例已被回收, 即在Java堆中不存在该类的任何对象实例
加载该类的ClassLoader已被回收.
该类对应java.lang.Class类对象不存在任何引用, 并且不存在任何通过反射机制对该类的方法的使用.
5. 垃圾收集算法:
标记-清除算法
标记-整理算法
复制算法
Eden区, 2 X Survivor区
HotSport 虚拟机默认设定的Eden与Survivor区域大小比为8:1
通过-XX:SurvivorRatio=8 参数可指定Eden与Survivor的比
分代收集算法:
新生代与老年代使用不同收集算法.
新生代使用 复制算法
老年代使用 标记-清除或这标记-整理算法
6. 垃圾收集器:
-Xmn 设定新生代大小
Serial :
新生代
单线程
ParNew :
新生代
使用多线程
Parellel Scavange: 多线程, 保证可控的吞吐量
CMS :
使用于老年代
多线程
通过 初始标记, 并发标记, 重复标记, 并发删除 以确保实现最短停顿时间.
Serial Old:
Serial收集器对应的 老年代版本
Parellel Old
parellel Sevange收集器对应 老年代版本
G1
使用手机-整理算法
将java堆分成若干大小固定的独立区域,
在固定时间内完成垃圾收集
根据垃圾堆积程度维护一优先级列表
优先收集垃圾最多的区域.
7. 内存分配及回收策略
优先在Eden分配.
当Eden空间不足以进行内存分配时, 将发生Minor GC, 此时如果Survivor中也无法满足内存分配时, 将进行分配担保提前进入老年代.
大对象直接进入老年代
参数 -XX:PretenureSizeThreshold 可指定大于该参数指定大小(以B为单位)的对象直接进入 老年代.
长期存活对象进入老年代
每个对象指定一age计数器
当对象每经历一次Minor GC并能被Survivor容纳, 则age + 1
通过 -XX:MaxTenuringThreshold 指定年龄阀值(默认15) , 当age 达到年龄阀值时, 则晋升为 老年代
动态对象年龄判定
当在Survivor空间中相同年龄对象大小总和大于Survivor空间的一半时, 则将该年龄之上(包括该年龄) 的对象移动到 老年代
空间分配担保
进行Minor GC之前, 虚拟机将检测之前进入老年代的对象平均大小是否大于老年代的剩余空间. 如果大于, 则改为直接进行一次Full GC. 如果小于, 如果判断设置HandlePromotionFailure设置允许担保失败, 则只进行Minor GC, 否则也进行一次Full GC.
8.GC种类:
Minor GC 发生于新生代的GC, 非常频繁, 且回收速度快
Major GC/Full GC: 发生于老年代的GC, 速度一般比Minor GC慢10倍.
浙公网安备 33010602011771号