代码编织梦想

一、垃圾回收算法

1、标记复制算法

会把内存分为相同的2个部分,每次回收,会把存活的对象移动到另一边,回收当前使用的空间。分配的内存被分成2份,实际使用空间变成正常的一半。但是不会出现垃圾碎片。

2、标记清除算法

标记存活的对象,把未标记的回收。回收后内存不是连续的,会产生大量的不连续的碎片,标记对象的时候效率低。

3、标记整理(压缩)算法

会把存活的对象移动到一起,清除边间外的垃圾对象,效率低

二、垃圾回收器

1、Serial和SerialOld

Serial是新生代,SerialOld是老年代的回收期,串行化执行,最简单的单线程的收集器,会STW。
CMS收集器如果空间不够无法进行FULL-GC,就会用SerialOld进行回收。
Serial使用标记复制,SerialOld使用标记整理算法

2、Parallel Scavenge收集器 Parallel Old

使用多线程,其他的和Serial相同,关心吞吐量,会自动调整参数设置吞吐量的大小,停顿的时间,提供最优的吞吐量。JDK8默认的收集器
新生代采用复制算法,老年代使用标记整理算法。

3、parNew收集器

使用多线程,其他的和Serial相同。使用复制算法
新生代的收集器,可以搭配CMS收集器使用,

4、CMS收集器

为了提高用户的体验,提供最短的STW,并发收集,可以让垃圾回收线程和用户线程同时使用,标记清除算法,默认情况下是老年代内存达到92%会执行FullGC
分为以下阶段:
(1)初始标记:会STW,但是速度非常快,标记GCROOT能引用的对象,可以用-XX:+CMSParallellnitialMarkEnabled参数开启多线程执行。
(2)并发标记:根据GCROOT遍历所有对象,过程比较慢,不会STW,会和用户线程一起执行。
(3)重新标记:因为并发标记中垃圾回收线程会和用户线程一同执行,可能会出现,被标记为垃圾对象的现在不是垃圾对象了会对产生变动的重新进行标记。会STW,比初始标记时间长,并发标记时间短。可以用 -XX:+CMSParallelRemarkEnabled 参数开启多线程重新标记。(存活的对象现在是垃圾对象,可达变不可达,是不会被重新标记的,这个是浮动垃圾
(4)并发清理:和用户线程一同执行,对未标记的对象清理,这个阶段如果有新添加的对象,会被标记为黑色。
(5)并发重置:重置本次标记的对象,与用户线程一同运行。

优点: 并发执行,低停顿,用户体验较好
缺点:

  • 会产生浮动垃圾只能等待下一次回收
  • 占用CPU资源
  • 标记清除会产生空间碎片,可以通过开启参数,做完发FullGC自动整理碎片( -XX:+UseCMSCompactAtFullCollection),可以通过参数设置多少次FullGC整理一次内存碎片( -XX:CMSFullGCsBeforeCompaction)

在FullGC执行前,可以先进行一次YGC来减少内存对象的引用,加快CMS在FullGC时标记的速度(-XX:+CMSScavengeBeforeRemark)
在这里插入图片描述

5、G1收集器

G1收集器把java的堆分为多个大小相等的区域Region,最多可以有2048个Region。一个Region = 堆容量/2048。适合大内存。

  • 年轻代(eden,survivor),占总容量的5%,但是在JVM运行的时候,会不断地给年轻代调整Region最多占60%可以通过参数调整-XX:G1MaxNewSizePercent。
  • 老年代:
  • Humongous区:专门用来存储大对象,如果这个对象超过Region的50%就是一个大对象
  • 在进行GC的时候年轻代、老年代、大对象区都会被回收。

(1)初始标记:会STW,记录GCROOT可以引用的对象,速度快
(2)并发标记:根据GCROOT遍历所有对象,过程比较慢,不会STW,会和用户线程一起执行。
(3)最终标记:和CMS的重新标记相同。
(4)筛选回收:根据设置的GC停顿时间(-XX:MaxGCPauseMillis)来设置回收计划,会对各个Region的进行回收的时间计算,优先选择回收价值高的Region来进行回收。默认的回收次数是8次,可以通过(-XX:G1MixedGCCountTarget)控制回收几次。会STW。
年轻代和老年代都是使用的复制回收算法,把一个Region复制到另一个Region中,不会出现空间碎片

  • YGC:YCG并不是Eden区满了就去回收,会先计算回收Eden需要多长时间,如果回收时间小于设置的回收时间,就继续给Eden分配Region,直到下一次满了在判断回收时间,如果接近设置的回收时间,就触发YGC.
  • MixedGC:老年代的占有率达到回收的默认45%,就会执行MixedGC,回收所有的年轻代、部分老年代和大对象,在这个过程中,如果剩下的空Region放不下存活的对象,就会触发FGC。
  • FGC:停止系统程序,采用单线程进行标记、清理、压缩,这个过程非常耗时。
    G1回收过程

三、三色标记算法

1、黑色

代表这个对象所有的引用都被扫描完成。

2、灰色

这个对象所有的引用可能还有至少1个对象引用没有被扫描到

3、白色

还没有扫描的会被标记为白色,如果在GC并发标记完成后,还是白色,就代表这个对象不可达,是个垃圾对象

在并发标记的过程中,用户线程和标记线程是同时运行的,这个时候就会出现已经是垃圾对象的被重新引用,但是它已经被标记为白色,或者某个对象由存活对象变成垃圾对象,对象的引用发生了改变,这个时候就会出现多标或者漏标

4、漏标

漏标会把引用的对象当成垃圾回收掉,可以用增量更新或者原始快照实现

(1)增量更新-CMS

黑色对象指向白色对象的引用时,就把这个新插入的引用记录下来,等并发扫描结束后,在把这些记录过引用关系的跟节点重新扫描。

(2)原始快照(SATB)-G1

灰色对象要删除指向白色对象的引用,把这个删除的引用记录下来,在并发扫描结束后,在把这个灰色的对象重新扫描,这样就能扫描到这个对象,然后把这个白色的对象标记为黑色,等待下一次GC,这个白色的对象有可能是浮动垃圾。

(3)增量更新和原始快照都需要和写屏障来实现

写前操作,写后操作
写屏障实现增量更新: 把新的应用对象记录下来
写屏障实现SATB: 把删除的引用存放到队列中

5、多标-浮动垃圾

执行并发标记的时候有些被扫描过得存活对象,已经销毁,它已经被标记为黑色,这些对象就是浮动垃圾,还有就是并发清理开始后产生的对象会被当成黑色,但是他有可能是垃圾对象,这些都是浮动垃圾。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44130094/article/details/123504630

jvm垃圾回收算法有哪几些?_wind瑞的博客-爱代码爱编程

常用的垃圾回收算法有如下四种:标记-清除、复制、标记-整理和分代收集。 标记-清除算法 从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。

jvm垃圾回收算法的优缺点_chu-jian的博客-爱代码爱编程_垃圾回收的缺点

最近在学习JVM的一些知识,所以特意写下学习笔记来简单记录知识点,由于只是初步的学习,下面本人所总结的内容都比较简单且不一定正确,如果有什么错误希望大家能指出来,我看到后会进行修正。 垃圾分析算法 功能:分析JVM堆上

「每天一道面试题」jvm垃圾回收算法有哪几些?_weixin_33961829的博客-爱代码爱编程

常用的垃圾回收算法有如下四种:标记-清除、复制、标记-整理和分代收集。 标记-清除算法 从算法的名称上可以看出,这个算法分为两部分,标记和清除。首先标记出所有需要被回收的对象,然后在标记完成后统一回收掉所有被标记的对象。 这个算法简单,但是有两个缺点:一是标记和清除的效率不是很高;二是标记和清除后会产生很多的内存碎片,导致可用的内存空间不连续

jvm垃圾回收算法和回收器-爱代码爱编程

一、垃圾回收算法: 1、引用计数法       引用计数法就是对于一个对象A,只要有任何一个对象引用了A,则A的计数器就加1,当引用失效时就减1。只要对象A的计数器数值为0,将会被回收。 注意:无法处理循环引用的问题,引用计数法不适合JVM的垃圾回收 2、标记--清除算法(Mark--Sweep) 标记清除算法就是先通过根节点标记所有可到达的

jvm垃圾回收算法总结_指尖凉的博客-爱代码爱编程

标记 - 清除算法   标记 - 清除算法顾名思义,就是有两段过程:第一步先标记,从每一个root节点开始向下遍历,当一个对象到root节点没有线路可达时,会被标记为可回收,然后统一扫描回收这些被标记的对象(一些资料上是写

简单理解 jvm 垃圾回收算法_dec_tail的博客-爱代码爱编程

1、标记-清除算法(Mark-Sweep) 标记-清除算法采用从根集合(GC Roots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,如下图所示。标记-清除算法不需要进行对象的移动,只需对不存活的对象进行处理,在存活对象比较多的情况下极为高效,但缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空

JVM垃圾回收算法各个算法的优缺点-爱代码爱编程

引用计数法、标记清除法、标记压缩法、复制算法、分代算法等。 1.引用计数器法:假设有一个对象A,任何一个对象对A的引用,那么对象A的引用计数器+1,当引用失败时,对象A的引用计数器就-1,如果对象A的引用计数器的值为0,就说明对象A没有引用了,可以被回收。 优缺点: 优点: 1.实时性较高,无需等到内存不够的时候,才开始回收,运行时根据对象的计数器是否为0

JVM 垃圾回收算法-爱代码爱编程

JVM的4种垃圾回收算法、垃圾回收机制与总结 1.标记清除 标记-清除算法将垃圾回收分为两个阶段:标记阶段和清除阶段。 在标记阶段首先通过根节点(GC Roots),标记所有从根节点开始的对象,未被标记的对象就是未被引用的垃圾对象。然后,在清除阶段,清除所有未被标记的对象。 im

jvm垃圾回收算法详解-爱代码爱编程

前言 相比C语言,JVM虚拟机一个优势体现在对对象的垃圾回收上,JVM有一套完整的垃圾回收算法,可以对程序运行时产生的垃圾对象进行及时的回收,以便释放JVM相应区域的内存空间,确保程序稳定高效的运行,但在真正了解垃圾回收算法之前,有必要对JVM的对象的引用做一个简单的铺垫 JVM对象可达性分析算法 Java虚拟机中的垃圾回收器采用可达性分析来探索所有

JVM 垃圾回收算法与ART CC回收器实现概述-爱代码爱编程

前言 在作者的上一篇文章《Android R常见GC类型与问题案例》中,对Demo应用的Heap堆结构与Space类型及相对应内存分配算法做了简要的探究,同时对Android R机器运行中常见的GC类型和具体卡顿案例进行了细致的梳理,对Android系统和应用开发人员了解学习ART GC运行策略和优化具体GC类问题具有一定的借鉴参考意义。 承接上

自学python?一般人我还是劝你算了吧-爱代码爱编程

前言 本人纯屌丝一枚,在学python之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说自学python,一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单,是个人稍微认点真都能懂,这就是好多人说的python简单、易懂、好学,然后就是一顿浮夸的言论,误导那些小白,再然后那些小白也就跟着浮夸。这里我就给那些轻浮的人泼一桶

JVM垃圾回收算法以及垃圾回收器机制-爱代码爱编程

文章目录 概述判断对象是否存活垃圾回收算法标记-清除算法复制算法标记整理算法分代收集算法垃圾收集器Serial收集器ParNew收集器Parallel Scavenge收集器Serial Old收集器Parallel Old 收集器CMS 收集器G1 收集器常见的垃圾回收器组合参数JVM默认垃圾回收器 概述 JVM中,程序计数器、虚拟机栈