本文共 1842 字,大约阅读时间需要 6 分钟。
什么是垃圾回收机制?
不定时的清理不可达对象,不可达对象不会立马被回收,垃圾收集器在一个 Java 程序中是自动的,不能强制执行,即使我们已经清楚的确定这块内存已经没有用处了,应该被回收掉,也不能强制执行,我们能做的只是调用 System.gc() 来建议垃圾回收器,这块内存可以回收,但垃圾收集器回收不回收,什么时候回收,都是不可知的finalize() 方法的作用在垃圾收集器回收对象前做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,该方法是在 Object 定义的,所以所有类都继承了它,子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作 新生代和老生代可以解决循环引用问题
必要时才回收缺点回收时,应用需要挂起
标记和清除的效率不高,尤其是要标记的对象很多的时候会造成内存碎片复制算法如果 JVM 使用了coping 算法,当创建一个对象时,首先会存放到 Eden 区域,当扫描到对象比较活跃,就将这些活跃的对象存放在 from 区域或者 to 区域,注意,这两个区域肯定有一个为空,如果对象存到了 form 区域,如果from 区域的对象随着程序执行出现了不可达对象,会将可达对象复制到 to 区域,直接清空 from 区域应用场景:发生在新生代优缺点:优点解决碎片化问题、性能高
造成空间浪费,from 或 to 始终有一个是空的标记压缩算法标记压缩算法和标记清除算法类似,不同的是将对象按顺序进行排列,直接将不可达对象一块删除任意顺序:即不考虑原先对象的排列顺序,也不考虑对象之间的引用关系,随意移动对象线性顺序:考虑对象的引用关系,例如 a 对象引用了 b 对象,则尽可能将 a 和 b 移动到一块滑动顺序:按照对象原来在堆中的顺序滑动到堆的一端优缺点:优点解决内存碎片问题
缺点在标记压缩时,由于排序改变了对象位置,需要更新引用
分代算法对于新生代,采用复制算法,对于老年代,采用标记->压缩->清除算法Minor GC 和 Full GC 区别:Minor GC:即新生代 GC ,发生在新生代的垃圾收集动作,所以 Minor GC 十分频繁,一般回收速度也较快,当 Eden 区域满时,会触发 Minor GCFull GC:即老年代 GC,发生在老年代的垃圾收集动作,所以 Full GC 很少发生,速度也较 Minor GC 慢十倍,当老年代满时,会触发 Full GC,同时会清除新生代和老年代,当永久代满时,也会触发 Full GC,JVM 的永久代中会发生垃圾回收吗?垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收 Full GC转载地址:http://zaqwm.baihongyu.com/