对象被判定为垃圾的标准
没有被其他对象引用引用计数算法(存在循环引用问题)可达性分析算法
通过判断对象的引用链是否可达来决定对象是否可以被回收 回收算法 标记清除算法
标记:从根集合进行扫描,对存活的对象进行标记清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存缺点:碎片化严重 复制算法
分为对象面和空闲面对象在对象面上创建存活的对象被从对象面复制到空闲面将对象面所有对象内存清除特点 :1、适用于对象存活率低的场景
2、解决碎片化问题
3、顺序分配内存,简单高效 标记整理算法
标记:从根集合进行扫描,对存活的对象进行标记清除:移动所有存活的对象,且按照内存地址依次排列,然后将末端内存地址以后的内存全部回收特点:1、避免内存的不连续(碎片化)
2、不用设置两块内存互换
3、适用于存活率高的场景 分代收集算法(主流算法)
垃圾回收算法的组合拳按照对象生命周期的不同划分区域以采用不同的垃圾回收算法目的:提高JVM的回收效率GC分类 ①Minor GC使用复制算法 用于新生代回收
② Full GC 使用标记清除算法和标记整理算法 用于老年代回收 新生代 尽可能快速的收集掉生命周期短的对象
1 Eden区
2 两个Survivor区
(1)Eden区与两个Survivor区(from区、to区)按照8:1:1的比例进行分配
(2)第一次回收时会先将Eden区存活对象复制到from区(年龄加1)清除Eden区,第二次回收Eden区域和from区存活对象复制到to区(年龄加1)(如果to区存放不下比较大的对象,将被放到老年代),然后对Eden区与from区进行清除。from区和to区互换进行第三次回收,(每次复制年龄加1)超过15岁的将放入老年代.
对象如何晋升到老年代
1 经历一定Minor次数(15)依然存活的对象
2 Survivor区中存放不下的对象
3 新生成的大对象 老年代 存放生命周期较长的对象
新生代空间:老年代空间 = 1:2
触发Full GC的条件
1 老年代空间不足
2 1.8之前 永久代空间不足
3 CMS GC时出现promotion failed , concurrent mode failure
4 Minor GC 晋升到老年代的平均大小大于老年代的剩余空间
5 调用system.gc()
6 使用RMIj来进行RPC或管理的JDK应用,每小时进行一次Full GC 垃圾收集器 Java中的四种引用 强引用(Strong Reference)
最普通的引用: new Object(0;抛出OutOFMemoryError终止程序也不会回收具有强引用的对象通过将对象设置为null来弱化引用,使其被回收 软引用(Soft Reference)
对象处在有用但非必须的状态只有当内存空间不足时,GC会回收该引用对象的内存可以用来实现高速缓存 弱引用(Weak Reference)
非必需的对象,比软引用更弱一些GC时会被回收被回收的概率也不大,因为GC线程优先级比较低适用于引用偶尔被使用且不影响垃圾收集的对象 虚引用
不决定对象的生命周期任何时候都可能被垃圾收集器回收跟踪对象被垃圾收集器回收的活动,起哨兵作用必须和引用队列ReferenceQueue联合使用