原理:创建对象(通常在堆区域)时,同时创建了参考计数器。当引用对象时,计数器是加1,当引用无效时,计数器会减少1.计数器为0时,这意味着此对象是垃圾
问题:存在周期参考的问题。
从这些根对象开始,将某些对象作为根对象(GC根)(GC根)确定,遍历与这些根对象具有参考关系以形成参考链的对象,并且这些参考链上的对象被判断为垃圾。
如下图所示,两个浅蓝色物体是垃圾。
问题是,哪些对象可以用作GC根?
优点:当要回收的物体较少时,效率较高
缺点:产生大量的内存片段
优点:解决大量内存片段的问题
缺点:不可用的记忆区域的一半,废物记忆
优点:没有内存破碎问题,不会导致记忆浪费
缺点:复制过程中效率低下
众所周知,JVM桩内存分为几代,如下所示。GC将在不同领域采用不同的GC算法
年轻一代:存储在王朝中死亡的大量人,使用标记副本算法来标记伊甸园地区的垃圾和来自地区的幸存者,然后将所有幸存的物体复制到幸存者中。
老年:长寿周期对象的存储,采用标记的组织算法,每次GC将幸存的对象复制到内存的一端时。
简而言之:当内存不够时,将发生GC
小型GC
时间:当伊甸园无法存储对象时
算法:标签复制算法
大型GC(全GC)
时间:当旧区域无法存储对象时
算法:标签完成算法
垃圾收集器与年轻人区分开
年轻一代收藏家使用复制算法,用于垃圾回收的单线线。在回收过程中,需要STW(停止世界)
与年长的收藏家合作:CMS,串行旧
优点:简单,高效,适合在单个核心环境中使用
缺点:无法使用当前机器是多核优点
Serial的多线程版本,除多线垃圾回收外,其余的与串行一致
与年长的收藏家合作:CMS,串行旧
优点:使用多核的功能(在单个核心环境中,串行比Parnew快)
缺点:在恢复过程中需要STW。
使用复制算法的年轻一代收藏家,多线垃圾回收,是与Parnew的差异,它注意该系统的吞吐量
倒数卷=运行用户代码 /(运行用户代码 + GC时间的时间)的时间适用于背景执行任务
该收藏家有两个参数:
-xx:maxgcpausemilis:设置垃圾回收的最大停顿
-xx:gctimeratio:设置废物回收时间的总时间比
设置-XX:MAXGCPAUSEMILIS可以提高响应速度,设置-XX:GCTIMERATIO可以改善吞吐量,提高CPU利用率效率的效率
此外,该收集器还有另一个参数:-xx:useadaptivesizepolicy。如果打开它,JVM将根据申请的应用状态动态设置伊甸园区域,幸存者区域和旧区域的比例,以提供最合适的暂停或最大最大暂停或最大最大暂停或最大值。
串行收集器的老式版本,一个线程,使用标记组织算法
并行清除收藏家的旧版本,多线程,使用标记汇编算法
最短停顿时间的收藏家
开始在Java 9中启用,并在Java 14中删除
优点:减少STW的时间并提高更好的响应速度
缺点:
G1逻辑还保留了年轻一代的概念。可以动态更改。每个时间GC都通过区域回收。通过-XX:MAXGCPAUSEMILS此参数,您可以设置stw every.eg的最大暂停。当发生年轻的GC时,应根据最大停顿尽可能多地计算G1,以及可以尽可能清理的数字。所有年轻地区的地区无法消除它以有效控制GC的停顿。
GC算法是总体标记。从单个区域,它是标签复制,单个区域的生存对象将被复制到空区域。
因此,ZGC适合在大记忆中提供低延迟
CMS存在一个很大的问题,即使用标记清晰的算法,这会导致碎片化严重。想想为什么CMS不使用标记汇编算法?CMS希望减少STW的时间的原因,因此,如果您使用标记进行组织,那么对象的参考地址将在对象进行分类时会更改。目前,无法访问用户线程。ESSENCETHIS将改进STW,因此已清除标记。
同样,当G1被标记时,STW也将进行Shennandoah复制时,在复制屏障并称为“ Brooks Pointers”时,它使用转发指针来避免使用STW过程。
关于垃圾收集器,我基本上描述了它。如果您对收藏家感兴趣,可以在深度研究中做
用户线程同时清除多CPU以将STW降低为优先级G1。您可以同时使用用户线程执行新一代。老年标记+复制多个CPU,更准确地控制STW时间共同组合: