大厂面试题专栏更文:一文帮你总结JVM 垃圾回收算法✨

Posted Code皮皮虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大厂面试题专栏更文:一文帮你总结JVM 垃圾回收算法✨相关的知识,希望对你有一定的参考价值。


😉毛遂自荐

毛遂自荐一下,给大家推荐一下自己的专栏😁,欢迎小伙伴们收藏关注😊

大厂面试题专栏

Java专栏

爬虫专栏

更多专栏尽在主页,点我😁!!!


🌈文章整体架构


🔥JVM垃圾回收算法


✨标记-清除算法

该算法分为“标记”和“清除”阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。也可以反过来先标记所有不需要被回收的对象,标记完成以后回收没有被标记的对象。

优缺点:

执行效率不稳定,适用于对象存过较多的区域,适用于老年代
会产生内存碎片

何为清除?

标记清除并不是真的置空,而是把需要清除的对象地址保存在空闲的地址列表里。下次有新对象需要加载时,判断垃圾的位置空间是否够,如果够,就存放



✨复制算法

可用内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一次清理掉。这样就使每次的内存回收都是对内存区间的一半进行回收。

优点:

不会出现内存碎片问题
对于存活对象少的区域(新生代),简单高效

缺点

将可用内存减少到一半,内存浪费过大
如果存活对象过多,那么复制对象所带来的开销也会增大



✨标记-整理算法

标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。

优点

消除了标记-清除算法中,内存区域分散的缺点,我们需要给新对象分配内存时,JVM只需要持有一个内存的起始地址即可。
消除了复制算法中内存减半的高额代价。

缺点

从效率上来说,标记-整理算法要低于复制算法
移动对象的同时,如果对象被其他对象引用,则还需要调整引用的地址。
移动过程中,需要全程暂停用户应用程序。



✨分代收集算法

当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几块。一般将 java 堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。

在新生代中,每次收集都会有大量对象死去,所以可以选择”复制“算法,只需要付出少量对象的复制成本就可以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选择“标记-清除”或“标记-整理”算法进行垃圾收集。



🔥常见垃圾回收器使用到的回收算法

  1. Serial收集器(复制算法): 新生代单线程收集器,标记和清理都是单线程,优点是简单高效;

  2. ParNew收集器 (复制算法): 新生代收并行集器,实际上是Serial收集器的多线程版本,在多核CPU环境下有着比Serial更好的表现;

  3. Parallel Scavenge垃圾回收器 (复制算法): 新生代并行收集器,追求高吞吐量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC线程时间),高吞吐量可以高效率的利用CPU时间,尽快完成程序的运算任务,适合后台应用等对交互相应要求不高的场景;

  4. Serial Old收集器 (标记-整理算法): 老年代单线程收集器,Serial收集器的老年代版本;

  5. Parallel Old收集器 (标记-整理算法): 老年代并行收集器,吞吐量优先,Parallel Scavenge收集器的老年代版本;

  6. CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的特点,追求最短GC回收停顿时间。

  7. G1(整体上可以看作是标记-整理,局部上看作为复制算法)



💖最后

我是 Code皮皮虾,一个热爱分享知识的 皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!!

创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见~~~


以上是关于大厂面试题专栏更文:一文帮你总结JVM 垃圾回收算法✨的主要内容,如果未能解决你的问题,请参考以下文章

备战秋招冲击大厂Java面试题系列—JVM及垃圾回收机制

大厂Java高级面试题汇总解答,超详细

jvm原理-----------1.开篇

018期JavaSE面试题(十八):JVM之垃圾回收

Java工程师必备:JVM原理内存模型调优垃圾回收机制面试题

018期JavaSE面试题(十八):JVM之垃圾回收