首页 > 编程知识 正文

js统计字符串出现次数最多的字母,快速收录技术

时间:2023-05-03 22:28:57 阅读:15008 作者:153

一、什么是G1收集器thegarbage-first(G1 ) garbagecollectorisaserver-stylegarbagecollector, targetedformultiprocessormachineswithlargememories.itattemptstomeetgarbagecollection (pausetimegoalswithighprobabilitywhill ole-HEAPoperations,such as全局标记,areperformedconcurrentlywiththeapplicationthreads.thispreventsinterrruptionspropprads

Garbage First (简称G1 )采集器是垃圾采集器技术发展史上的里程碑式成果,开创了采集器局部采集的设计思路和基于Region的内存布局形式。

作为CMS收集器的替代者和继承人,设计者们希望制作能够构建“休眠时间模型”的收集器。 休眠时间模型指定为长度m毫秒的时间段,这意味着可以支持垃圾收集所消耗的时间不超过n秒的概率高的目标。

二、G1采集器内存管理1、混合GC模式G1里程碑的意义来自于其局部采集的设计思路和基于Region的内存布局形式,这也是G1实现其停机模型的基础。 G1收集器出现之前的所有其他收集器(包括已被其取代的CMS )的目标范围是整个虚心的指甲油费(Minor GC )或上一代(Major GC )或整个Java堆)。 G1实现了可以面向堆内存的任何部分构成再收集。 衡量标准不再是分代的,而是回收的实际利益。 这就是混合GC机型。

2、基于Region的堆内存布局G1基于Region的堆内存布局是实现混合GC的关键。 G1不能说放弃了分代理论。 相反,G1仍然是基于分代理论设计的,但堆的内存布局与其他收集器非常不同。 不是坚持固定大小和固定数量的分代区域划分,而是将堆分为多个大小相等的独立区域,称为Region,每个Region都可能是谦虚的手册或过时的年代。 由此,对于任何对象,都可以得到比较好的收集效果。

从上图中可以看到,Region还具有用于存储大对象的Humongous区域。 G1我们认为一个对象的大小超过了一个Region的一半,它可以称为大对象。 如果对象的大小超过一个Region,它将存储在多个连续的Region中。 另外值得注意的是,G1的大部分行动都将Humongous Region作为古老年代的一部分来看待。

3、G1优先区域回收方式G1之所以能建立可预测的休眠时间模型,是因为将Region作为1次回收的最小单位。 G1收集器跟踪每个Region中垃圾的总“价值”大小,即回收获得的空间大小和回收时间经验值,并在后台维护优先级列表。 您可以根据用户设置回收价值收益最大的Region。 这也是“Garbage First”名字的由来。

三、G1收藏家花了很多时间解决的三个尖锐问题G1收藏家作为跨越时代的收藏家,从论文发表到商用经历了10多年的研发,其中解决了无数问题。 以下向读者说明三个典型而重要的问题。

1、Region之间的引用问题怎么解决? 与其他收集器解决世代间问题的方式一样,G1使用内存集来防止将所有堆用作GC Roots扫描。 但是,G1中的每个Region都有自己的存储集,记录另一个Region指向自己的指针,并标记这些指针分别位于哪个卡页的范围内。 G1的存储集在存储结构的本质上是散列表(key是另一个Region的起始地址,Value是卡表的索引号的集合)。

由于Region的数量很多,每个Region都有自己的内存集,因此G1收集器需要更多的内存来保持工作。 此数量通常为Java堆的10%~20%。

2、如何保证在并发阶段收集线程和用户线程相互不干扰地运行? 首先,当用户线程改变对象引用关系时,必须避免破坏原始对象地图结构,并且标记结果会出现错误。 CMS用增量更新算法解决了这个问题,而G1用原始快照(SATB )的方法解决了。

然后,在重用过程中,新对象必须分配内存。 在G1中,每个Region都有两个名为TAMS的指针,Region的部分空间用于同时回收期间的新对象指定。 新对象的地址必须位于这两个指针上。 此空间的某些部分被收集器视为默认库存,不属于回收范围。

3、如何建立可靠的停顿预测模型? G1收集器的姿态预测模型是以衰减平均为理论基础实现的。 在垃圾回收过程中,G1收集器记录每个Region的回收时间、存储集中脏卡数量等步骤的成本,并根据一定的统计信息和统计算法计算出“衰减平均值”。 衰减平均值更准确地表示了最近的平均状态,Region的统计状态越新,越决定回收的价值。

基于这些信息,收集器可以确定哪个Region应该进入回收,最终在不超过预期时间的情况下获得

得最高收益。

四、G1收集器实际运作的四大步骤 1、初始标记

标记一下GC Roots能直接关联到的对象。并且修改TAMS的值,让并发标记阶段分配对象有据可依。这个阶段需要停顿线程,但耗时很短,并且在Minor GC时同步完成。

2、并发标记

从GC Root中开始对堆中对象进行可达性分析,扫描对象图,找出要回收的对象,这阶段耗时长但是可以和用户程序并发执行。当对象图扫描完成后,还要重新处理SATB记录下的在并发时有引用变动的对象。

3、最终标记

对用户线程做一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那些少量的SATB记录。

4、筛选回收

负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,制定具体的回收计划。可以自由地选择多个Region作为回收集,把其中存活的对象复制到空的Region中,再清理掉整个回收集。由于涉及存活对象的移动,所以必须暂停用户线程。

总之,G1收集器的设计目标是在延迟可控的前提下获得尽可能高的吞吐量。

五、G1收集器与CMS收集器的比较

作为两款关注停顿时间的收集器,G1常被作为CMS收集器的比较对象。在今天,G1已经几乎完全取代了CMS的地位,但这并不意味着CMS在G1面前不值一提。
先说明一个事实:在小内存上CMS的表现可能会优于G1,而大内存上G1毫无疑问会占据优势。这个堆内存大小的平衡点通常在6~8GB左右。

1、G1的新设计带来的优势

指定最大停顿时间、分Region的内存布局、按收益确定最终回收集,这些都是G1的新设计给它带来的相对于CMS的优势。

2、整体收集算法的不同

CMS集于标记-清除算法进行收集,而G1从整体看集于标记-整理算法进行收集,局部看基于标记-复制算法进行收集。显然,G1的两种解读方法都意味着它不会产生任何内存碎片。这样的特性有利于程序长久地平稳运行。

3、内存消耗不同

我们前文中提到,G1收集器为每一个Region都提供了卡表作为记忆集,显然这意味着G1相比CMS需要消耗更大量的内存来完成其本职工作。相比之下CMS的卡表仅有一份且实现简单。

4、执行负载不同

CMS使用写后屏障来更新和维护卡表。G1除了使用写后屏障,为了实现快照搜索算法,它还得使用写前屏障来跟踪并发时的指针变化情况。这也引出了原始快照和增量更新两种方法的比较:原始快照能够减少并发标记和重新标记阶段的损耗,避免在标记阶段停顿时间过长,但它同时也会产生由于跟踪引用变化带来的额外负担。
由于G1写屏障的复杂操作要比CMS消耗更多的运算资源,CMS的写屏障实现是直接的同步操作,而G1必须把它实现为类似消息队列的架构,即把写前屏障和写后屏障要做的事都放到队列里,然后异步处理。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。