精华内容
下载资源
问答
  • 一、什么是GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C主要区别之一,...1、复制算法(Copying):在JVM堆内存当中,新生代使用复制算法。新生代内存区域又分成Eden、Fro...

    通过优锐课核心java学习笔记中,我们可以看到GC的三种收集方法,码了很多专业的相关知识, 分享给大家参考学习。

    一、什么是GC
    Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,在使用JAVA的时候,一般不需要专门编写内存回收和垃圾清理代码。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。
    二、关于GC的三种算法
    1、复制算法(Copying):在JVM的堆内存当中,新生代使用的是复制算法。新生代的内存区域又分成Eden、From、To三个区域,这三个区域的内存占用比例是8:1:1,新创建(new)出来的对象存放在Eden区和From区中,当整两个区的内存到达一定的占用量后,会进行轻量级的垃圾回收(Minor GC),将存活下来的对象年龄+1,并将存活下来的对象复制到To区,此时Fron区和To区进行交换(区分From区和To区:谁空谁是To,并且From区和To区是不断交换的)。当一个对象的年龄达到15时,将此对象从新生代移动到老年代。优点:不产生内存碎片问题,能保持对象的完整性。缺点:因为要一致保持To区是空的,浪费了一定的内存空间。
    2、标记清除/标记整理算法(Full GC 或者 Major GC):老年代一般是由标记清除或者是标记清除和整理的混合实现。
    (1)标记清除算法:Mark-Sweep步骤一:标记:从根集合开始扫描,对存活的对象进行标记步骤二:清除:再次扫描整个内存空间,回收未被标记的对象,使用free-list记录可用区域。优点:两次扫描,耗时严重,会产生内存碎片。缺点:不需要占用额外空间。
    (2)标记整理算法:Mark-Compact标记/整理算法唯一的缺点也是效率不高,不仅要标记所有存活对象,还要整理存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法
    。三、三种算法的一些小结内存效率:
    复制算法>标记清除算法>标记整理算法。
    内存整齐度:复制算法=标记整理算法>标记清理算法。
    内存利用率:标记整理算法=复制算法>标记清理算法。

    喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
    如果你对java技术很感兴趣也可以加入我的java学习群 V–(ddmsiqi)来交流学习,里面都是同行,验证【CSDN2】有资源共享。

    展开全文
  • 分代收集理论;标记-复制算法标记-清除算法;标记-整理算法。

    写在前面的话

    读者您好,本人目前同时在经营CSDN和微信公众号,希望小伙伴们能够给予支持,关注一下我的微信公众号,公众号是每天都会推送新文章,CSDN不定期发表新文章。

    文末有公众号二维码,可以扫码关注,或者微信直接搜索“波波Tea”,带哪吒头像的那个就是我,谢谢!

     

    垃圾收集算法的实现涉及大量的程序细节,且各个平台的虚拟机操作内存的方法都有差异,本文暂不过多讨论算法实现,只重点介绍分代收集理论和几种算法思想及其发展过程。


    1、分代收集理论

     

    当前商业虚拟机的垃圾收集器,大多数都遵循了“分代收集”的理论进行设计,它建立在两个分代假说之上:

    • 弱分代假说:绝大多数对象都是朝生夕灭的

    • 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡

     

    这两个分代假说共同奠定了多款常用的垃圾收集器的一致的设计原则:

    • 收集器应该将Java堆划分出不同的区域

    • 然后将回收对象依据其年龄(年龄即对象熬过垃圾收集过程的次数)分配到不同的区域之中存储

    • 如果一个区域中大多数对象都是朝生夕灭,那么把它们集中放在一起,就能以较低代价回收到大量的空间

    • 如果剩下的都是难以消亡的对象,那把它们集中放在一块,虚拟机便可以使用较低的频率来回收这个区域

    • 这就同时兼顾了垃圾收集的时间开销和内存的空间有效利用

    在Java堆划分出不同的区域之后,垃圾收集器才可以每次只回收其中某一个或者某些部分的区域,因而才有了

    • Minor GC

    • Major GC

    • Full GC

    这样的回收类型的划分;也才能够针对不同的区域使用相匹配的垃圾收集算法,因而发展出了

    • 标记-复制算法

    • 标记-清除算法

    • 标记-整理算法

    等针对性的垃圾收集算法。

     

    1.1、分代假说存在什么问题?

    但是分代收集并非只是简单划分一下内存区域那么容易,它至少存在一个明显的困难:对象不是孤立的,对象之间会存在跨代引用。

    假如现在只进行一次新生代收集(Minor GC),但新生代中的对象是完全有可能被老年代所引用的,为了找出该区域中的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是一样。

    遍历整个老年代所有对象的方案虽然理论上可行,但无疑会为内存回收带来很大的性能负担,为了解决这个问题,就需要对分代收集理论添加第三条经验法则:

    • 跨代引用假说:跨代引用相对于同代引用来说仅占极少数。

     

    1.2、如何解决?

    存在互相引用关系的两个对象,是应该倾向于同时生存或者同时消亡的。举个例子,如果某个新生代对象存在跨代引用,由于老年代对象难以消亡,该引用会使得新生代对象在收集时同样难以消亡,进而在年龄增长之后晋升到老年代中,这时跨代引用也随即被消除了。

    因此,我们就不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在及存在哪些跨代引用,只需在新生代上建立一个全局的数据结构(该结构被称为记忆集”),这个结构把老年代划分成若干小块,标识出老年代的哪一块内存会存在跨代引用。此后当发生Minor GC时,只有包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描。虽然这种方法需要在对象改变引用关系时维护记录数据的正确性,会增加一些运行时的开销,但比起收集时扫描整个老年代来说仍然是划算的。

     

    部分收集(Partial GC)又分为:

    • 新生代收集(Minor GC/Young GC):只收集新生代

    • 老年代收集(Major GC/Old GC):只收集老年代。目前只有CMS收集器会有单独收集老年代的行为,Major GC这个说法现在有点混淆,需按上下文区分到底是指老年代的收集还是整堆收集

    混合收集(Mixed GC):收集整个新生代以及部分老年代,目前只有G1收集器会有这种行为

    整堆收集(Full GC):收集整个Java堆和方法区

     

     

    2、标记清除法

     

    最早出现也是最基础的垃圾收集算法是标记-清除(Mark-Sweep)算法,分为“标记”和“清除”两个阶段:

    • 首先标记出所有需要回收的对象

    • 在标记完成后,统一回收掉所有被标记的对象

    • 也可以反过来,标记存活的对象,统一回收所有未被标记的对象

     

    标记过程就是对象是否属于垃圾的判定过程。

    之所以说它是最基础的收集算法,是因为后续的收集算法大多都是以标记-清除算法为基础,对其缺点进行改进而得到的。它的主要缺点有两个:

    • 执行效率不稳定,如果Java堆中包含大量对象,而且其中大部分是需要被回收的,这时必须进行大量标记和清除的动作,导致标记和清除两个过程的执行效率都随对象数量增长而降低

    • 内存空间的碎片化问题,标记、清除之后会产生大量不连续的内存碎片

     

     

    3、标记复制法

     

    3.1、标记复制法的思想和优缺点

    为了解决标记清除算法面对大量可回收对象时执行效率低的问题,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

    如果内存中多数对象都是存活的,这种算法将会产生大量的内存间复制的开销,但对于多数对象都是可回收的情况,算法需要复制的就是占少数的存活对象,而且每次都是针对整个半区进行内存回收,分配内存时也就不用考虑有空间碎片的复杂情况,只要移动堆顶指针,按顺序分配即可。这样实现简单,运行高效。

    其缺陷也显而易见,这种复制回收算法的代价是将可用内存缩小为了原来的一半,空间浪费未免太多了一点。

     

    3.2、HotSpot虚拟机的具体实现

    HotSpot虚拟机默认Eden和Survivor的大小比例是8∶1,也即每次新生代中可用内存空间为整个新生代容量的90%(Eden的80%加上一个Survivor的10%)。当Survivor空间不足以容纳一次Minor GC之后存活的对象时,就需要依赖其他内存区域(实际上大多就是老年代)进行分配担保,这些对象便将通过分配担保机制直接进入老年代,这对虚拟机来说就是安全的。

     

    3.3、标记复制法的具体步骤

    1. 首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom区,当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收,经过这次回收后还存活着的对象,则直接复制到To区域(如果有对象的年龄已经达到了老年的标准,则赋值到老年代区),同时把这些对象的年龄 + 1

    2. 然后,情况Eden和SurvivoFrom中的对象,也即复制之后有交换,谁空谁是To

    3. SurvivorTo和SurvivorFrom互换

    4. 最后,SurvivoTo和SurvivorFrom互换,原SurvivorTo成为下一次GC时的SurvivorFrom区。部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终如果还是存活,就存入老年代

     

     

    4、标记整理法

     

    4.1、标记清除法的思想

    标记复制算法在对象存活率较高时就要进行较多的复制操作,效率将会降低。更关键的是,如果不想浪费50%的空间,就需要有额外的空间进行分配担保,以应对被使用的内存中所有对象都100%存活的极端情况,所以在老年代一般不能直接选用这种算法。

    针对老年代对象的存亡特征,标记整理法其中的标记过程仍然与标记清除算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向内存空间一端移动,然后直接清理掉边界以外的内存,如下图所示。

     

    4.2、标记整理法的优缺点

    标记清除算法与标记整理算法的本质差异在于前者是一种非移动式的回收算法,而后者是移动式的。是否移动回收后的存活对象是一项优缺点并存的风险决策:

    • 如果移动存活对象,尤其是在老年代这种每次回收都有大量对象存活区域,移动存活对象并更新所有引用这些对象的地方将会是一种极为负重的操作,而且这种对象移动操作必须全程暂停用户应用程序才能进行,这就更加让使用者不得不小心翼翼地权衡其弊端了。

    • 但如果跟标记清除算法那样完全不考虑移动和整理存活对象的话,弥散于堆中的存活对象导致的空间碎片化问题就只能依赖更为复杂的内存分配器和内存访问器来解决。内存的访问是用户程序最频繁的操作,甚至都没有之一,假如在这个环节上增加了额外的负担,势必会直接影响应用程序的吞吐量。

    基于以上两点,是否移动对象都存在弊端。

    • 从垃圾收集的停顿时间来看,不移动对象停顿时间会更短,甚至可以不需要停顿

    • 但是从整个程序的吞吐量来看,移动对象会更划算

    HotSpot虚拟机里面关注吞吐量的Parallel Scavenge收集器是基于标记整理算法的,而关注延迟的CMS收集器则是基于标记清除算法的。另外还有一种“和稀泥式”解决方案,做法是让虚拟机平时多数时间都采用标记清除算法,暂时容忍内存碎片的存在,直到内存空间的碎片化程度已经大到影响对象分配时,再采用一次标记整理法,前面提到的基于标记清除法的CMS收集器面临空间碎片过多时采用的就是这种处理办法。

     

    展开全文
  • 垃圾回收算法1.1 标记-清除法1.2 复制算法(新生代算法) 1. 垃圾回收算法 1.1 标记-清除法 "标记-清除"算法是最基础收集算法。算法分为"标记""清除"两个阶段 标记出所有需要回收对象(遍历堆标记) ...

    1. 垃圾回收算法

    1.1 标记-清除法

    "标记-清除"算法是最基础的收集算法。算法分为"标记"和"清除"两个阶段

    1. 标记出所有需要回收的对象(遍历堆标记)
    2. 标记完成后统一回收所有被标记的对象(遍历堆删除)

    "标记-清除"算法的不足之处:

    1. 效率问题:标记 和 清除这两个过程效率都不高。
    2. 空间问题:标记和清除后会产生大量 不连续的 内存碎片,空间碎片太多 可能会导致 以后在程序运行中 需要分配较大对象时,无法找到足够连续内存而不得不触发一次垃圾回收,触发一次之后要是内存还不够,就会连续触发,导致OOM

    在这里插入图片描述

    1.2 复制算法(新生代算法)

      "复制"算法是为了解决"标记-清理"的效率问题。它将可用内存 按容量划分为大小相等的两块,每次只使用其中的一块,当这块内存需要垃圾回收时,会将此区域还活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要按序分配即可。此方法实现简单,运行高效。
    在这里插入图片描述
      新生代中98%的对象都是 ‘‘朝生夕死’’ 的,所以并不需要按照1:1的比例来划分空间,而是将内存(新生代内存)分为一块**比较大的Eden(伊甸园)两块较小的Survivor(幸存者)**空间,每次使用Eden和其中一块Survivor(两个Survivor区域一个称为From区,另一个称为To区)。当回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor空间

    HotSpot默认Eden:Survivor From:Survivor To=8:1:1,所以每次新生代可用内存空间为整个新生代容量的90%,而剩下的10%用来存放回收后存活的对象。

    当Survivor空间不够用时,需要依赖其它内存(老年代进行分配担保)

    HotSpot实现复制算法的流程:

    1. 当Eden区满的时候,会触发第一次Minor gc,把还活着的对象拷贝到Survivor From区;当Eden区再次触发Minor gc的时候,会扫描Eden和From区域,对两个区域进行垃圾回收,经过这次回收后还存活的对象,直接赋值到To区域,并将Eden和From区域清空。
    2. 当后续Eden又发生Minor gc的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到From区域,并将Eden和To区域清空。
    3. 部分对象会在From和To区域中复制来复制去,如此交换15次(由JVM参数MaxTenuringThreshold决定,这个参数默认是15),最终还是存活,就存入老年代。

    1.3 标记-整理算法(老年代回收算法)

      复制算法 在对象存活率较高时 会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。针对老年代的特点,提出了一种称之为"标记-整理"算法。标记过程仍与"标记-清除"中标记的过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界(除存活对象)以外的内存。
    在这里插入图片描述

    1.4 分代收集算法

    当前JVM垃圾收集都采用的是"分代收集"算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。
    一般是把Java堆分为新生代和老年代。在新生代中,每次垃圾回收都有大批的对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象的存活率高,没有额外空间对他进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法。

    1.5 Minor GC、Major GC、Full GC的区别?

    堆内存划分为Eden、Survivor、和Tenured/Old空间

    • Minor GC 又称为新生代GC 指的是发生在新生代的垃圾回收操作(包括Eden区和Survivor区)。当JVM无法为一个新的对象分配空间时候,会触发Minor GC。因为新生代中大多数对象的生命周期都很短,因此Minor GC(采用复制算法)非常频繁,虽然它会触发stop-the-world,但是回收速度也比较快。

    • Major GC清理老年代,出现Major GC通常会出现至少一次Minor GC即大多数Major GC是由Minor GC触发的

    • Full GC是针对整个堆空间包括新生代、老年代、元空间GC,Full GC不等于Major GC,也不等于Minor GC+Major GC。

    展开全文
  • 垃圾收集算法: 复制算法、标记清楚算法、标记整理算法(标记压缩算法)、分代收集理论 垃圾收集器: Serial、Paraller、Parnew、CMS、G1、ZGC 区别:垃圾回收算法是趋于理论形式类型,而垃圾收集器是对理论具体...

    浅谈垃圾收集器和垃圾回收算法

    垃圾收集算法和垃圾收集器的区别?

    • 垃圾收集算法: 复制算法、标记清楚算法、标记整理算法(标记压缩算法)、分代收集理论
    • 垃圾收集器: Serial、Paraller、Parnew、CMS、G1、ZGC
      区别:垃圾回收算法是趋于理论形式类型的,而垃圾收集器是对理论的具体实现,是具体的支撑。

    垃圾收集算法

    • 复制算法:复制算法主要是新生代收集算法的理论,新生代对象都是朝生夕死的对象,所以触发minor gc的时候不会出现大量的存活对象,此时用复制算法可以把存活的对象放入到Survivor区。优点:没有大量的对象移动,效率会高点,复制算法存活对象到幸存区不会产生内存碎片,空间利用率高。

    • 标记清除算法:标记清除算法分为标记(mark)和清除(sweep)两个阶段,标记清除是堆中需要清理的垃圾对象首先标记起来,然后进行垃圾清理。缺点:不适应于大规模存活的对象,大规模存活的对象需要标记的太多,效率会很低。其次是内存利用率的问题,大规模的标记清楚会导致大量的内存碎片的产生,如果不配合标记整理,空间利用率可想而知。

    • 标记整理算法: 标记整理算法其实和标记清楚算法差不多,标记整理是先用标记清除算法标记,然后把存活的对应移到另一端,清除掉边界以外的垃圾对象。优势是弥补了标记清楚的短板,整理算法是得空间利用率变高,缺点是:整理算法在整理阶段,由于移动了可用对象,需要去更新引用。

    • 分代垃圾收集理论:就是将堆根据生存对象生命周期的不同,把堆划分为新生代、老年代,然后根据不同年代的特点选择合适的垃圾收集器。

    垃圾收集器

    • Serial: 串行垃圾收集器,最早的垃圾收集器之一,单线程垃圾收集器,意味着在垃圾收集期间,其他所有用户线程全部暂停(STW)。
      新生代采用复制算法,老年代使用标记整理算法。

    • Paraller:Serial串行收集器的升级版,并行收集器,特点在垃圾收集期间,采用多核Cpu的优点,采用多线程的方式并发的收集,效率提高。优点是提高了吞吐量,STW时间更短。
      新生代采用复制算法,老年代使用标记整理算法。
      XX:ParallelGCThreads: 指定在垃圾收集器收集的时候使用几个线程并行收集。

    • Parnew:垃圾收集器基本和Paraller一样,都是多线程收集器,优势在于Parnew能和CMS收集器搭配使用,使得收集效率更高。
      生代采用复制算法,老年代采用标记-整理算法。

    CMS垃圾收集器(Concurrent Mark Swap)
    CMS真正意义上的并行垃圾收集器,在以往的Parnew和Paraller垃圾搜集器虽然都是并行的垃圾收集器,但是在垃圾回收期间会暂停所有的用户线程,造成用户体验感可能变差,而CMS垃圾收集器在垃圾收集过程中,用户线程和垃圾收集器是一起工作的,在此期间不会早成STW。
    过程:

    1. 初始标记:暂停所有的STW,记录下所有被GCroot直接引用的对象,标记。此过程STW时间极短。
    2. 并发标记: 并发标记就是扫描GCroot标记的对象,继续往下标记对应的引用,此过程不会产生STW,是和垃圾收集器并发执行的。
    3. 重新标记: 重新标记是为了防止在并发标记过程中,用户线程可能会把标记的某个引用置为null或者更换引用。此过程会STW,STW时间相对初始标记过程时间长不少。此过程对于标记变动部分使用了三色标记的方式解决。
    4. 并发清理: 开启用户线程,同时垃圾收集器堆未标记的对象进行清理,此过程新产生的对象会变为黑色(三色标记)
    5. 并发重置: 重置本次GC的标记数据。

    优点:STW综合停顿时间会低不少,
    缺点: 在并发清理过程和并发标记过程中,用户线程的并发执行新产生的垃圾对象变为浮动垃圾,只能下次GC清除;并且在并发清理和并发标记过程中老年代如果不足以放下新生代产生的老年代对象,会产生==concurrent mode fail ==,造成此原因的后果就是STW,垃圾收集器采用Serial单线程。
    由于老年代采用的是标记清除算法,所以在清除的过程中会产生大量的内存碎片,故需要开启内存整理。XX:+UseCMSCompactAtFullCollection

    CMS调优:

    开启CMS:XX:						+UseCMSCompactAtFullCollection
    垃圾收集线程数:					-XX:ConcGCThreads:
    开启标记清楚之后进行内存压缩整理: -XX:+UseCMSCompactAtFullCollection:
    压缩整理是在几次GC之后整理:      -XX:CMSFullGCsBeforeCompaction:
    

    三色标记算法
    三色标记算法主要针对在垃圾收集过程中用户线程会对标记的对象引用修改和删除的情况作出修正。

    • 三色标记把我们GCroot标记的对象分为三个颜色,分别为黑、灰、白
      黑色:黑色是针对此对象的所有引用对象都被垃圾收集器扫描过的。
      灰色: 灰色对象标识此对象被垃圾收集器访问过,但是此对象的引用至少还有一个没被垃圾收集器访问。
      白色:白色就是未被垃圾收集器访问过的对象。默认都是白色的。
      多标:
      场景:GCroot已经扫描过的对象,恰巧此时用户线程执行完被GCroot引用的此对象所在的方,那么此时这个对象就是一个垃圾对象,也就是浮动垃圾,那么此时就是多标的情况,多标的情况此时会被赋予黑色,下次GC清理,同样新生代垃圾对象也会变为黑色。
      漏标:
      A-B-C: A黑B灰C白
      场景:三色标记规则黑色对象所有的引用都被扫描过,所以说并不会扫描他有那些引用执行了具体的那些对象;此时在扫描黑色对象的引用B的时候,把灰色对象下的白色对象引用置为null,那么此时白色对象依旧仍然是白色垃圾对象,但是此时把黑色对象A的引用执行A,那么此时由于A是黑色,已经被扫描过,此时A-C,而B下的C=null,此时C这个对象就会被删除,而A-C这个引用就失效,变成了漏标问题。
    • 解决此类问题有两种:
      1. 增量更新:增量更新就是把我们A-C的引用纪录纪录下来,并发结束后,以A为根,再次进行扫描,此时就能扫描到C,此时把C置为灰色,避免漏标。
      2. 原始快照(SATB):原始快照就是把B和C之间的引用职位置为nulll的时候,首先记录下B=C这个引用记录,然后等并发扫描结束后,去查找引用的记录,再次以B为根,进行扫描,此时扫描的C直接置为黑色,防止漏标。
        以上两种过程都是利用读写屏障来实现漏标的。
        默认CMS垃圾收集器是采用整理更新来避免漏标。
        *跨带引用问题?尚未清楚原理
    展开全文
  • 垃圾回收算法主要分为三种:标记-清除,标记-复制和标记-整理。 其中,Java语言是基于分代,在新生代主要使用了标记-复制,在新生代中分为eden,s0区s1区。 其中,绝大多数对象都是直接在eden区进行分配,然后s0...
  • Java 堆的区别

    2018-11-08 12:15:16
    比如,标记-消除,复制,标记-整理,分代(即新生代使用复制算法,老年代使用标记——压缩) b. 栈使用是数据结构中栈,先进后出原则,物理地址分配是连续。所以性能快。 内存分配 a. 堆因为是不连续,...
  • GC种类GC算法种类精简梳理

    千次阅读 2018-10-30 22:41:42
    主要有五种GC: 1.Serial GC ...新生代Serial GC采用复制算法,老年代Serial GC采用标记-整理算法,由于区别算法不同,老年代Serial GC专称Serial Old。 -XX:+UseSerialGC 2.ParNew G...
  • 垃圾收集器ParNewCMS1、垃圾收集算法1、分代收集理论2、标记复制算法3、标记清除算法4、标记整理算法2、垃圾收集器1、Serial垃圾收集器2、Parallel Scavenge垃圾收集器3、ParNew垃圾收集器4、CMS垃圾收集器3、垃圾...
  • JVM垃圾收集算法

    2019-01-21 12:29:56
     5 Minor GCFull GC的区别 1 标记-清除算法 采用从根集合(GC Roots)开始扫描,对存活的对象进行标记标记完毕后,再扫描整个空间中未被标记的对象,进行回收。 缺点:1. 标记和清除两个过程的效率都不高...
  • 标记整理算法前面的标记清除算法的区别在于多了一个步骤,这里会把内存空间进行整理,也就是说,在清除部分内存之后,会将内存往前移动,该算法的优点在于不会导致内存碎片,但是这种算法的速度比较慢。...
  • JVM垃圾回收算法:标记-清除算法,复制算法标记-整理算法,分代收集算法的详细过程;HotSpot实现垃圾回收的过程;伊甸园幸存者的介绍;新生代GC老年代GC的区别
  • 在java中,虽然垃圾回收算法只有三种,也就是我们耳熟能详标记清除算法(MS),复制算法(Copy),标记整理算法,这几个概念我在另一篇博客中有写到:java几种常见垃圾回收算法 但是由他们衍生出来垃圾回收器却...
  • 在GC时,会考虑物理地址不连续,而使用不同算法,比如复制算法标记-整理算法,标记-清楚算法等。 栈中物理地址是连续,LIFO原则,性能较快。 2、内存分别 堆因为是不连续,所以分配内存是在运行期...
  • 无用的类垃圾收集算法标记-清除算法复制算法标记-整理算法分代收集算法垃圾收集器SerialParNewParallel ScavengeSerial OldParallel OldCMS(Concurrent Mark Sweep)G1CMS收集器G1收集器的区别? 引用计数法 给对象...
  • 引用计数算法2、可达性分析算法垃圾收集算法三大垃圾收集算法最基础收集算法 —— 标记/清除算法复制算法标记/整理算法终极算法 —— 分代收集算法 jvm内存模型(JMM) 每个JVM都有两种机制: 一个是装在具有合格...
  • 文章目录JVMJava内存区域JavaC++在GC上的区别Java不同版本中运行时数据区域的区别程序计数器Java虚拟机栈本地方法栈堆方法区运行时常量池直接内存类加载过程类的生命周期加载连接验证准备解析初始化对象创建过程类...
  • 春招实习_阿里一面

    2020-12-19 18:57:00
    帖子的表怎么设计的帖子支持图片吗有没有想法把自己的... 标记整理标记清除算法和复制算法的执行过程有没有看过 JVM 的源码吗,但是我看过HashMap的源码那你说一下HashMap 怎么实现的 --> 存储,put实现,查找...
  • 08 新生代老年代

    2020-08-06 11:46:32
    1. 新生代老年代的区别? 新生代:一般占据堆的 1/3 空间。用来存放新生的对象,新生代对象朝生夕死,对象存活率低,新生代MinorGC非常频繁,一般回收速度也比较快。新生代常采用 复制算法。 老年代:主要存放...
  • JVM 虚拟机笔记

    2017-12-25 11:35:00
    标记-清除算法复制算法标记-整理算法分代收集 新生代--[15次GC]-->老年代新生代:复制算法老年代: 标记-清除算法或标记-整理算法 GC策略采用的何种算法引用计数算法根搜索算法 内存泄漏内存溢出的区别jvm ...
  • TCP/IP体系结构

    千次阅读 2020-06-13 22:46:42
    标记-清除算法(Mark-Sweep):复制算法(Copying)标记整理算法(Mark-Compact)分代收集算法:(新生代GC+老年代GC)Stop-The-World GC概述 一、GC是什么? (1)GC:Garbage Collection 垃圾收集。这里所谓垃圾指...
  • 来源 | 个人博客 | 橙子wj整理 | Java后端技术| 徐刘根对于常见GC算法,我们都应该知道,例如:标记清除算法、复制算法标记整理算法等。标记清除算法由于回收之后存在大量内存碎片,存在效率空间问题!...
  • Java虚拟机垃圾回收(二) 垃圾回收算法:标记-清除算法 复制算法 标记-整理算法 分代收集算法 火车算法https://blog.csdn.net/tjiyu/article/details/53983064(里面含各种算法的应用场景) 标记-清除算法会使内存...
  • 2019年面试记录

    2019-01-04 21:10:00
    6、JVM中GC算法:复制算法、标记清理算法、标记整理算法,讲一个 7、redis的数据类型 8、深复制浅复制的区别? 9、测试开发的区别,测试测试开发的区别 测试是从用户角度出发,检测开发做的东西是不是符合...
  • JVM--垃圾收集器

    2019-08-15 16:09:53
    垃圾收集器是垃圾回收算法(标记-清除算法、复制算法标记-整理算法、火车算法)具体实现,不同商家、不同版本JVM所提供垃圾收集器可能会有很在差别,本文主要介绍HotSpot虚拟机中垃圾收集器。 并行...
  • 27 标记整理算法(Mark-Compact).................................................................................................. 28 分代收集算法 ..........................................................

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

标记整理和复制算法的区别