本文转载自微信公众号「Java极客技术」,作者鸭血粉丝。转载本文请联系Java极客技术公众号。
在盐亭等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、成都网站设计 网站设计制作按需网站设计,公司网站建设,企业网站建设,成都品牌网站建设,全网营销推广,成都外贸网站建设公司,盐亭网站建设费用合理。
作为一个 Java 开发,在面试的过程中垃圾回收器是经常会被问到的一个问题,随着 Java 的发展,垃圾回收器也经历了很多的发展。大家熟知的垃圾回收器主要有下面几种。
回收算法
在介绍垃圾回收器之前,我们先了解一下垃圾回收器背后的算法,每个垃圾回收器都是具体算法的实现,不同的垃圾回收器只是背后的算法不同而已,下面就先简单介绍下具体的算法。
标记清除
标记清除算法是一种先标记,后清除的算法,在第一次扫描的时候先标记出所有需要清理的内存,将所有需要回收的内存都标记过后,一次性清理掉。这种算法简单但是效率低,而且内存碎片化严重。内存一旦碎片化严重的话,就会浪费内存,无法分配较大的对象。
复制算法
复制算法的实现方式比较简洁明了,就是霸道的把内存分成两部分,在平时使用的时候只用其中的固定一份,在当需要进行 GC 的时候,把存活的对象复制到另一部分中,然后将已经使用的内存全部清理掉。这种算法可以解决碎片化的问题,但是缺点也很明显,就是浪费内存,有一半的内存都不能使用。
标记整理算法
既然标记清除和复制算法各有优缺点,那自然的我们就想到是否可以把这两种算法结合起来,于是就出现了标记整理算法。标记阶段是标记清除算法一样,先标记出需要回收的部分,不过清除阶段不是直接清除,而是把存活的对象往内存的一端进行移动,然后清除剩下的部分。
标记整理的算法虽然可以解决上面两个算法的一些问题,但是还是需要先进行标记,然后进行移动,整个效率还是偏低的。
分代回收算法
分代回收算法是目前使用较多的一种算法,这个不是一个新的算法,只是将内存进行的划分,不同区域的内存使用不同的算法。根据对象的存活时间将内存的划分为新生代和老年代,其中新生代包含 Eden 区和 S0,S1。在新生代中使用是复制算法,在进行对象内存分配的时候只会使用 Eden 和 S0 区,当发生 GC 的时候,会将存活的对象复制到 S1 区,然后循环往复进行复制。当某个对象在进行了 15 次GC 后依旧存活,那这个对象就会进入老年代。老年代因为每次回收的对象都会比较少,因此使用的是标记整理算法。
垃圾回收器
上面虽然提到了好几个垃圾回收器,但是目前主流的垃圾回收器只有 CMS 和 G1。下面就跟大家聊下这两个垃圾回收器。
CMS 垃圾回收器
CMS 全称 Concurrent Mark Sweep 并发标记清除垃圾回收器。CMS 是一种以获取最短停顿时间为目的的垃圾回收器。提到停顿时间,我们都知道任何垃圾回收器在进行工作的时候都会出现 STW,Stop the World 停止用户进程,这对业务来说只很难接受的,但是现在市面上所有的垃圾回收器都无法避免这个问题,只能最大化的去优化,从而降低停顿的时间。
CMS 虽然被称为是并发的垃圾回收器,但是也并不是完全并发的,从名字上我们可以看到是采用标记-清除算法来实现的,整个实现过程分为五个步骤:
G1 垃圾回收器
G1 全称 Garbage-First 是一种面向服务器的垃圾回收器,通过将堆内存划分为多个 Region 来实现可预测的停顿时间模型。在 G1 当中,新生代和老年代已经不再是物理隔离,而都是被划分一个个 Region 区域。正是由于这种可预测的时间停顿模型让 G1 成为了一个高吞吐量的垃圾回收器。G1 能充分利用 CPU,多核环境下可以缩短 STW 的时间。
G1 垃圾回收器的整个实现过程分为四个步骤:
总结
虽然说 Java 开发不用程序员去手动创建和回收内存,但是了解和掌握垃圾回收器是每个 Java 程序员必须要掌握的,不仅仅是面试的过程中会被问到,对自己的职业发展也是很有帮助的。本文是阿粉自己学习和整理的,部分资料参考网络上,分享给大家,帮助大家一起成长。
本文标题:常见的垃圾回收器你知道有哪些吗?
网址分享:http://www.shufengxianlan.com/qtweb/news0/539650.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联