当前位置:首页 » 操作系统 » 标算法

标算法

发布时间: 2023-01-06 11:31:44

‘壹’ JVM垃圾回收的“三色标记算法”实现,内容太干

三色标记法是一种垃圾回收法,它可以让JVM不发生或仅短时间发生STW(Stop The World),从而达到清除JVM内存垃圾的目的。JVM中的 CMS、G1垃圾回收器 所使用垃圾回收算法即为三色标记法。

三色标记法将对象的颜色分为了黑、灰、白,三种颜色。

白色 :该对象没有被标记过。(对象垃圾)

灰色 :该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾)

黑色 :该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象)

从我们main方法的根对象(JVM中称为GC Root)开始沿着他们的对象向下查找,用黑灰白的规则,标记出所有跟GC Root相连接的对象,扫描一遍结束后,一般需要进行一次短暂的STW(Stop The World),再次进行扫描,此时因为黑色对象的属性都也已经被标记过了,所以只需找出灰色对象并顺着继续往下标记(且因为大部分的标记工作已经在第一次并发的时候发生了,所以灰色对象数量会很少,标记时间也会短很多), 此时程序继续执行,GC线程扫描所有的内存,找出扫描之后依旧被标记为白色的对象(垃圾),清除。

具体流程:

在JVM虚拟机中有两种常见垃圾回收器使用了该算法:CMS(Concurrent Mark Sweep)、G1(Garbage First) ,为了解决三色标记法对对象漏标问题各自有各自的法:

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用集中在互联网网站或者基于浏览器的B/S系统的服务端上,这类应用通常都会较为关注服务的响应速度,希望系统停顿时间尽可能短,以给用户带来良好的交互体验。CMS收集器就非常符合这类应用的需求(但是实际由于某些问题,很少有使用CMS作为主要垃圾回收器的)。

从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于标记-清除算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为四个步骤,包括:1)初始标记(CMS initial mark) 2)并发标记(CMS concurrent mark) 3)重新标记(CMS remark) 4)并发清除(CMS concurrent sweep)

其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GCRoots能直接关联到的对象,速度很快;

并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;

重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;

最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

在应对漏标问题时,CMS使用了增量更新(Increment Update)方法来做:

在一个未被标记的对象(白色对象)被重新引用后, 引用它的对象若为黑色则要变成灰色,在下次二次标记时让GC线程继续标记它的属性对象

但是就算是这样,其仍然是存在漏标的问题:

G1(Garbage First)物理内存不再分代,而是由一块一块的Region组成,但是逻辑分代仍然存在。G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能够对扮演不同角色的Region采用不同的策略去处理,这样无论是新创建的对象还是已经存活了一段时间、熬过多次收集的旧对象都能获取很好的收集效果。

Region中还有一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量一半的对象即可判定为大对象。每个Region的大小可以通过参数-XX:G1HeapRegionSize设定,取值范围为1MB~32MB,且应为2的N次幂。而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region之中,G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待,如图所示

Card Table(多种垃圾回收器均具备)

RSet(Remembered Set)

是辅助GC过程的一种结构,典型的空间换时间工具,和Card Table有些类似。

后面说到的CSet(Collection Set)也是辅助GC的,它记录了GC要收集的Region集合,集合里的Region可以是任意年代的。

在GC的时候,对于old->young和old->old的跨代对象引用,只要扫描对应的CSet中的RSet即可。逻辑上说每个Region都有一个RSet,RSet记录了其他Region中的对象引用本Region中对象的关系,属于points-into结构(谁引用了我的对象)。

而Card Table则是一种points-out(我引用了谁的对象)的结构,每个Card 覆盖一定范围的Heap(一般为512Bytes)。G1的RSet是在Card Table的基础上实现的:每个Region会记录下别的Region有指向自己的指针,并标记这些指针分别在哪些Card的范围内。这个RSet其实是一个Hash Table,Key是别的Region的起始地址,Value是一个集合,里面的元素是Card Table的Index。每个Region中都有一个RSet,记录其他Region到本Region的引用信息;使得垃圾回收器不需要扫描整个堆找到谁引用当前分区中的对象,只需要扫描RSet即可。

CSet(Collection Set)

一组可被回收的分区Region的集合, 是多个对象的集合内存区域。

新生代与老年代的比例

5% - 60%,一般不使用手工指定,因为这是G1预测停顿时间的基准,这地方简要说明一下,G1可以指定一个预期的停顿时间,然后G1会根据你设定的时间来动态调整年轻代的比例,例如时间长,就将年轻代比例调小,让YGC尽早行。

SATB(Snapshot At The Beginning), 在应对漏标问题时,G1使用了SATB方法来做,具体流程:

因为SATB在重新标记环节只需要去重新扫描那些被推到堆栈中的引用,并配合Rset来判断当前对象是否被引用来进行回收;

并且在最后G1并不会选择回收所有垃圾对象,而是根据Region的垃圾多少来判断与预估回收价值(指回收的垃圾与回收的STW时间的一个预估值),将一个或者多个Region放到CSet中,最后将这些Region中的存活对象压缩并复制到新的Region中,清空原来的Region。

会,当内存满了的时候就会进行Full GC;且JDK10之前的Full GC,为单线程的,所以使用G1需要避免Full GC的产生。

解决方案:

‘贰’ 三色标记算法

golang的垃圾回收机制是典型的mask-sweep,标记整理。一般来说,有两种方法可以用来作为标记的方法:

使用三色标记算法:可以渐进执行而不需要每次都去扫描整个空间,减少了stop the world的时间。相比传统的标记清扫算法,三色标记最大的好处是可以异步执行,从而可以以中断时间极少的代价或者完全没有中断来进行整个 GC。

三色标记算法原理(黑白灰):

三色标记算法的缺陷:
会丢失对象。
比如说一个黑色对象引用了一个白色对象,会把这个白色对象给清理掉,但是实际上它是存在引用的

https://www.kancloud.cn/aceld/golang/1958308

‘叁’ 申请留学,GPA一般用标准算法还是常见算法

一般都用标准算法,但是每个美国的学校对每一个中国的学校都会有一定的变化,而且他们有他们自己的一套算法,所以你最好就是标出你在所有学生中的%,让学校开一个也行,最好包装一下。。。

过分关心这些算法是没有太多的意义的,无论多还是少,你最终目的不是要申请吗? 只要申请了就有希望,不申请一定没有希望,所以多做申请,就算申请harvard也是有希望的,只是可能会是小概率事件而已,所以找几个自己觉得差不多的学校,多申请几个,分高中低三档来申请。每档至少2个学校吧。。。
祝好运!

‘肆’ 什么是摄像机的算法

摄像机标定算法分传统标定算法,自标标定算法和基于主动视觉的标定算法。
是从两维平面图像中获得三维信息这一关键步骤。
你在写论文?还是在研究?

‘伍’ 投标算法求救

首先我需要指出你理解错误的地方:下浮率在12.3%~13.7%之间出现没错,但这两个数字出现的几率并不像你想的那么小,因为最大和最小值是不参与计算的,如你连续摇出最小的6个号,另一个随便是多少,你的最终值都是12.3%,也就是说最小值出现的几率比你想象的增大了15倍。最大值也同理。
另外,如果你有兴趣,可以按照排列组合的原理,计算出每个数值出现的概率,然后画出走势图,的确应该是正态分布。不过你想做出表格函数估计难度不小。毕竟也是同样原理,只是相同号码允许重复的排列组合。单的走势分析图都是用专门做出来的,EXCEL还解决不了这么有内涵的东西。

‘陆’ 出国GPA怎么计算“加权算法”和“标准算法”用哪个算法

GPA就是Grade Point Average,我们都把它叫做“平均成绩点”。也有人把它俗称为“平均分数”或“平均绩点”。要注意的是,这个“平均”并不是简单的“算术平均”而应该是“加权平均”。而这个“权数”就是学分。

美国一般学校GPA的满分是4分,也就是把90分以上的A作为4分来计算的话:A=4、B=3、C=2、D=1。另外,在实际计算GPA的时候,往往会把精确度确定在小数点以后2位——比如:3.02、3.45等等。

计算GPA的时候,通常有两种算法——用百分制计算和4分制计算:

1、百分制计算:

百分制计算公式 GPA = ∑(分数×学分)×4÷〔(∑学分)×100〕

2、另外一种算法是换算成四分制以后计算:

四分制计算公式:GPA = ∑(四分制分数×学分)/(∑学分)

(6)标算法扩展阅读:

GPA的计分方式主要有算术平均分、加权平均分、学分绩点和平均学分绩点四种。

算术平均分是把所有科的分数加起来再除以科目数;

加权平均分是每门课的分数乘以该科对应的学分后相加,再除以总学分的平均数;

学分绩点和是每门课的绩点乘以相应学分后的总和;

平均学分绩点则是每门课的学分乘相应绩点后的总和除以总学分,也就是学分绩点和除以总学分。

在四种计分方式中,中国主要计算学分加权平均分,国外为五分制,主要采用平均学分绩点,平均学分绩点和学分绩点和的效果相同。

‘柒’ 申请美国学校硕士GPA一般算法标准算法

是这样的。现在的GPA根据学校的不同,有以下3种可能性:
1.学校出的成绩表上自带GPA,你申请的学校直接使用这个自带GPA
这样的GPA,大多数为楼主所说的常见GPA。
2.学校出的成绩的GPA被你申请的学校无视,老外自算GPA,这个GPA,大多数学校使用楼主所谓的标准算法
3.这个是目前最流行的,公证GPA。这个又分2种,1是公正你本科学校的实力和你的专业的排名,再考虑你的GPA给出1个值。另外1种是公证你的GPA,跟学校核对以后按照你申请的学校要求的算法给出新的GPA,这个算法大多数公证使用的
也是标准算法。
所以,你要根据你所申请的学校的要求查证,有的学校是会重新算,有的学校会要求必须公证。

‘捌’ 男生正常体重标准算法

世界卫生组织计算公式中,男性标准体重计算公式=(身高cm-80)×70%;女性标准体重计算公式=(身高cm-70)×60%;高于或低于标准体重10%属于正常体重,高于或低于标准体重10%~ 20%属于体重超重或体重过轻。

‘玖’ GC垃圾回收(3)- 三色标记算法

CMS过程在上篇文章 GC垃圾回收(2) 中已经写过。
它分为四个阶段:

其中 并发标记 阶段会有漏标的问题,为解决这个问题,采用了 "三色标记算法"

G1 GC(Garbage First Garbage Collector)是一种服务端应用使用的垃圾收集器,目标是用在 多核、大内存 的机器上,它在大多数情况下可以实现指定的GC暂停时间,同时还能保持较高的吞吐量。它的吞吐量相较PS+PO降低了大概10%~15%,但是大大降低了响应时间,大概200ms的程度

G1内存模型如下:

G1相较之前其它的垃圾回收器,对模型进行了改变,不再进行物理分代,采用逻辑分代。

它不再将连续内存分为Eden区和Old区,而是将内存分为一个个的Region。一块Region(分区)在逻辑上依然分代,分为四种:Eden,Old,Survivor,Humongous(大对象,跨多个连续的Region)。

它的每个分区都可能是年轻代也可能是老年代,但是在同一时刻只能属于某个代。

年轻代、幸存区、老年代这些概念还存在,成为了逻辑上的概念,这样方便复用之前分代框架的逻辑。在物理上不需要连续,这带来了额外的好处——有的分区内垃圾对象特别多,有的分区内垃圾对象很少,G1会优先回收垃圾对象特别多的分区,这样可以花费较少的时间来回收这些分区的垃圾,这也就是G1名字的由来,即首先回收垃圾最多的分区。

新生代其实并不适用于这种算法,依然是在新生代满了的时候,对整个新生代进行回收——整个新生代中的对象,要么被回收、要么晋升,至于新生代也采取分区机制的原因,则是因为这样跟老年代的策略统一,方便调整代的大小。

G1还是一种带压缩的收集器,在回收老年代的分区时,是将存活的对象从一个分区拷贝到另一个可用分区,这个拷贝的过程就实现了局部的压缩。每个分区的大小从1M到32M不等,但都是2的幂次方。

特点:

G1与CMS在并发收集时的算法没太大区别,用的是 三色标记 算法。但ZGC和Shenandoah使用的是 颜色指针 Colored Pointers。

主要用于分代模型中帮助垃圾回收。

为什么需要 card table ?
寻找存活对象并不是一件容易的事。从一个GC root对象寻找,可能被Old区对象引用,这个Old区对象又被Eden区对象引用,那么判断Eden区对象是否存活就需要遍历整个Old区存活对象看是否被Old区对象引用。这样的话每进行一次YGC就要扫描整个Old区。

所以JVM内部,将内存区域分为一个个的card,对象存在一个个的card里。当老年代某个card中的对象指向了年轻代,就会将这个card标记为 Dirty 。这么多card具体哪个是 Dirty的,用位图BitMap来代表(如0110010010,1表示Dirty),这就是Card Table。

Card Table :由于做YGC时,需要扫描整个Old区,效率非常低,所以JVM设计了Card Table, 如果一个Old区Card Table中有对象指向Y区,就将它设为Dirty,下次扫描时,只需要扫描Dirty Card。 在结构上,Card Table用BitMap来实现。

RSet会占用一定的空间,所以ZGC又做了改进,不使用RSet,用颜色指针来标记。

Rset与赋值的效率:

5% ~ 60%(新生代)

G1能跟踪STW停顿时间,根据停顿时间动态调整新生代(Y区)比例

超过单个region的 50% 就是一个大对象,也可跨越多个region。

注意: G1也是存在FGC的,并且一定会被触发。当对象分配不下是会产生FGC。

回收时不分新生代还是老年代什么的,region满了就回收。

MixedGC过程:

跟CMS非常像,MixedGC最后是筛选回收,多了个筛选步骤。筛选就是找出垃圾最多的region。筛选后将存活对象复制到其他region,再将之前的region清空。

CMS和G1在并发标记时使用的是同一个算法: 三色标记法 ,使用白灰黑三种颜色标记对象。白色是未标记;灰色自身被标记,引用的对象未标记;黑色自身与引用对象都已标记。

在remark过程中,黑色指向了白色,如果不对黑色重新扫描,则会漏标。会把白色D对象当作没有新引用指向从而回收掉。

并发标记过程中,Mutator删除了所有从灰色到白色的引用,会产生漏标。此时白色对象应该被回收

产生漏标问题的条件有两个:
1.黑色对象指向了白色对象
2.灰色对象指向白色对象的引用消失

所以要解决漏标问题,打破两个条件之一即可:

为什么G1采用SATB而不用incremental update?
因为采用incremental update把黑色重新标记为灰色后,之前扫描过的还要再扫描一遍,效率太低。
G1有RSet与SATB相配合。Card Table里记录了RSet,RSet里记录了其他对象指向自己的引用,这样就不需要再扫描其他区域,只要扫描RSet就可以了。
也就是说 灰色-->白色 引用消失时,如果没有 黑色-->白色,引用会被push到堆栈,下次扫描时拿到这个引用,由于有RSet的存在,不需要扫描整个堆去查找指向白色的引用,效率比较高。SATB配合RSet浑然天成。

热点内容
android停靠 发布:2025-05-11 08:42:23 浏览:644
超时代加密 发布:2025-05-11 08:41:29 浏览:779
为什么还要输入支取密码 发布:2025-05-11 08:32:24 浏览:362
数据库课程设计案例 发布:2025-05-11 08:15:33 浏览:51
为什么安卓不能通过蓝牙传东西 发布:2025-05-11 08:15:27 浏览:717
tomcat下载linux 发布:2025-05-11 07:47:06 浏览:792
phpcookie设置时间 发布:2025-05-11 07:36:15 浏览:111
固态硬盘需要缓存吗 发布:2025-05-11 07:29:09 浏览:606
松江换门密码锁哪里有 发布:2025-05-11 07:23:21 浏览:327
自动配置代理什么意思 发布:2025-05-11 07:16:51 浏览:994