星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易( 四 )

  • 显式地将对象的唯一强引用赋值为Null 。
  • 局部引用所指向的对象(如 , 方法内对象) 。
  • 只有弱引用与其关联的对象 。
  • 3.2 几种典型的垃圾回收算法3.2.1 标记-清除算法(Mark-Sweep)
    星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易最基础的垃圾回收算法 , 分为“标注”和“清除”两个阶段:首先标记出所有需要回收的对象 , 在标记完成后统一回收掉所有被标记的对象 。
    标记过程:为了能够区分对象是live的,可以为每个对象添加一个marked字段 , 该字段在对象创建的时候 , 默认值是false 。
    清除过程:去遍历堆中所有对象 , 并找出未被mark的对象 , 进行回收 。 与此同时 , 那些被mark过的对象的marked字段的值会被重新设置为false , 以便下次的垃圾回收 。
    缺点:效率低 , 空间问题(产生大量不连续的内存碎片) , 后续可能发生大对象不能找到可利用空间的问题 。
    3.2.2 复制算法(Copying)
    星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易为了解决Mark-Sweep算法内存碎片化的缺陷而被提出的算法 。 按内存容量将内存划分为大小相等的两块 , 每次只使用其中一块 。 当这一块内存满后将尚存活的对象复制到另一块上去 , 把已使用的内存空间一次清理掉 。 这种算法虽然实现简单 , 内存效率高 , 不易产生碎片 , 但是最大的问题是可用内存被压缩到了原本的一半 。 且存活对象增多的话 , Copying算法的效率会大大降低 。
    3.2.3 标记-整理算法标记-整理算法采用标记-清除算法一样的方式进行对象的标记 , 但在清除时不同 , 在回收不存活的对象占用的空间后 , 会将所有的存活对象往左端空闲空间移动 , 并更新对应的指针 。 标记-整理算法是在标记-清除算法的基础上 , 又进行了对象的移动 , 因此成本更高 , 但是却解决了内存碎片的问题 。 具体流程见下图:
    星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易3.2.4 分代收集算法分代收集算法是目前大部分JVM的垃圾收集器采用的算法 。 它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域 。 一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation) , 在堆区之外还有一个代就是永久代(Permanet Generation) 。 老年代的特点是每次垃圾收集时只有少量对象需要被回收 , 而新生代的特点是每次垃圾回收时都有大量的对象需要被回收 , 那么就可以根据不同代的特点采取最适合的收集算法 。
    星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易4.总结java虚拟机的内容 , 本章就到此告一段落 。 只是小编个人的见解 , 如有哪里不准确的地方 , 请大家多多评论指出 。 后续有时间 , 会相继补充未完善的地方 。
    看完本章后 , 相信大家也能对JVM有了一定的认知与理解 , 不过 , 路漫漫 , 其修远兮!继续加油吧!在这里再推荐一下清华扫地僧大佬整理的JVM调优实战视频 , 有需要深度获取的朋友 , 请关注小编 , 并私信回复【JVM】即可哦~~~
    星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易
    星球狂想战队|清华扫地僧带你深入JVM调优实战,思路清晰,精通简直太容易还在犹豫什么 , 赶紧行动起来吧~~~


    推荐阅读