JVM调优总结(三)基本垃圾回收算法

可以从不同的的角度去划分垃圾回收算法:

按照基本回收策略分

引用计数(Reference Counting):

比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。

标记-清除(Mark-Sweep):

此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。

复制(Copying):

此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间。

标记-整理(Mark-Compact):

此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。

按分区对待的方式分

增量收集(Incremental Collecting):实时垃圾回收算法,即:在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。

分代收集(Generational Collecting):基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代,对不同生命周期的对象使用不同的算法(上述方式中的一个)进行回收。现在的垃圾回收器(从J2SE1.2开始)都是使用此算法的。

按系统线程分

串行收集:串行收集使用单线程处理所有垃圾回收工作,因为无需多线程交互,实现容易,而且效率比较高。但是,其局限性也比较明显,即无法使用多处理器的优势,所以此收集适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。

并行收集:并行收集使用多线程处理垃圾回收工作,因而速度快,效率高。而且理论上CPU数目越多,越能体现出并行收集器的优势。

并发收集:相对于串行收集和并行收集而言,前面两个在进行垃圾回收工作时,需要暂停整个运行环境,而只有垃圾回收程序在运行,因此,系统在垃圾回收时会有明显的暂停,而且暂停时间会因为堆越大而越长。

 

第二篇:JVM调优总结(九)-新一代的垃圾回收算法

垃圾回收的瓶颈

传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是Full GC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个相对较小范围内,但是这样有限制了应用本身的处理能力,同样也是不可接收的。

分代垃圾回收方式确实也考虑了实时性要求而提供了并发回收器,支持最大暂停时间的设置,但是受限于分代垃圾回收的内存划分模型,其效果也不是很理想。

为了达到实时性的要求(其实Java语言最初的设计也是在嵌入式系统上的),一种新垃圾回收方式呼之欲出,它既支持短的暂停时间,又支持大的内存空间分配。可以很好的解决传统分代方式带来的问题。

增量收集的演进

增量收集的方式在理论上可以解决传统分代方式带来的问题。增量收集把对堆空间划分成一系列内存块,使用时,先使用其中一部分(不会全部用完),垃圾收集时把之前用掉的部分中的存活对象再放到后面没有用的空间中,这样可以实现一直边使用边收集的效果,避免了传统分代方式整个使用完了再暂停的回收的情况。

当然,传统分代收集方式也提供了并发收集,但是他有一个很致命的地方,就是把整个堆做为一个内存块,这样一方面会造成碎片(无法压缩),另一方面他的每次收集都是对整个堆的收集,无法进行选择,在暂停时间的控制上还是很弱。而增量方式,通过内存空间的分块,恰恰可以解决上面问题。

Garbage Firest(G1)

这部分的内容主要参考这里,这篇文章算是对G1算法论文的解读。我也没加什么东西了。

目标

从设计目标看G1完全是为了大型应用而准备的。

支持很大的堆

高吞吐量

--支持多CPU和垃圾回收线程

--在主线程暂停的情况下,使用并行收集

--在主线程运行的情况下,使用并发收集

实时目标:可配置在N毫秒内最多只占用M毫秒的时间进行垃圾回收

当然G1要达到实时性的要求,相对传统的分代回收算法,在性能上会有一些损失。

算法详解

G1可谓博采众家之长,力求到达一种完美。他吸取了增量收集优点,把整个堆划分为一个一个等大小的区域(region)。内存的回收和划分都以region为单位;同时,他也吸取了CMS的特点,把这个垃圾回收过程分为几个阶段,分散一个垃圾回收过程;而且,G1也认同分代垃圾回收的思想,认为不同对象的生命周期不同,可以采取不同收集方式,因此,它也支持分代的垃圾回收。为了

达到对回收时间的可预计性,G1在扫描了region以后,对其中的活跃对象的大小进行排序,首先会收集那些活跃对象小的region,以便快速回收空间(要复制的活跃对象少了),因为活跃对象小,里面可以认为多数都是垃圾,所以这种方式被称为Garbage First(G1)的垃圾回收算法,即:垃圾优先的回收。

回收步骤:

初始标记(Initial Marking)

G1对于每个region都保存了两个标识用的bitmap,一个为previous marking bitmap,一个为next marking bitmap,bitmap中包含了一个bit的地址信息来指向对象的起始点。

开始Initial Marking之前,首先并发的清空next marking bitmap,然后停止所有应用线程,并扫描标识出每个region中root可直接访问到的对象,将region中top的值放入next top at mark start(TAMS)中,之后恢复所有应用线程。

触发这个步骤执行的条件为:

G1定义了一个JVM Heap大小的百分比的阀值,称为h,另外还有一个H,H的值为(1-h)*Heap Size,目前这个h的值是固定的,后续G1也许会将其改为动态的,根据jvm的运行情况来动态的调整,在分代方式下,G1还定义了一个u以及soft limit,soft limit的值为H-u*Heap Size,当Heap中使用的内存超过了soft limit值时,就会在一次clean up执行完毕后在应用允许的GC暂停时间范围内尽快的执行此步骤;

在pure方式下,G1将marking与clean up组成一个环,以便clean up能充分的使用marking的信息,当clean up开始回收时,首先回收能够带来最多内存空间的regions,当经过多次的clean up,回收到没多少空间的regions时,G1重新初始化一个新的marking与clean up构成的环。

并发标记(Concurrent Marking)

按照之前Initial Marking扫描到的对象进行遍历,以识别这些对象的下层对象的活跃状态,对于在此期间应用线程并发修改的对象的以来关系则记录到remembered set logs中,新创建的对象则放入比top值更高的地址区间中,这些新创建的对象默认状态即为活跃的,同时修改top值。

最终标记暂停(Final Marking Pause)

当应用线程的remembered set logs未满时,是不会放入filled RS buffers中的,在这样的情况下,这些remebered set logs中记录的card的修改就会被更新了,因此需要这一步,这一步要做的就是把应用线程中存在的remembered set logs的内容进行处理,并相应的修改remembered sets,这一步需要暂停应用,并行的运行。

存活对象计算及清除(Live Data Counting and Cleanup)

值得注意的是,在G1中,并不是说Final Marking Pause执行完了,就肯定执行Cleanup这步的,由于这步需要暂停应用,G1为了能够达到准实时的要求,需要根据用户指定的最大的GC造成的暂停时间来合理的规划什么时候执行Cleanup,另外还有几种情况也是会触发这个步骤的执行的:

G1采用的是复制方法来进行收集,必须保证每次的”to space”的空间都是够的,因此G1采取的策略是当已经使用的内存空间达到了H时,就执行Cleanup这个步骤;

对于full-young和partially-young的分代模式的G1而言,则还有情况会触发Cleanup的执行,full-young模式下,G1根据应用可接受的暂停时间、回收young regions需要消耗的时间来估算出一个yound regions的数量值,当JVM中分配对象的young regions的数量达到此值时,Cleanup就会执行;

partially-young模式下,则会尽量频繁的在应用可接受的暂停时间范围内执行Cleanup,并最大限度的去执行non-young regions的Cleanup。

 

第三篇:土地整理施工总结

该土地整理工程位于巴东县溪丘湾生态茶叶示范园园区内,土地整理面积400亩。工程于20xx年x月x日经批准开工,20xx年x月x日施工完成。经我司组织自检,按图纸和施工合同的要求施工内容全部完成,自检质量评定为“合格”。现施工总结如下:

一、开工前准备充分:

1、项目组织机构明确,对项目组织机构及人员配置进行了落实,做到了项目机构组织明确,职能清楚。

2、针对工程制定了工程质量目标:“合格”,安全目标:“无重大伤亡事故”。文明施工目标:“达标”。

3、编制蓄水池专项施工方案。项目部工程技术人员结合工程特点和公司的资源现状,编制了专项施工方案,并报业主、监理审批。

4、现场布置完善:根据业主提供条件,三通一平工作已经落实。

二、对工程质量控制管理严格,分项分部工程质量验收评定合格

1、强化施工过程质量控制

(1)、技术控制措施齐全:

由于技术方案和措施是进行质量预控的关键。本工程项目部根据工程设计要求,充分考虑质检员、施工员,做业班组可行性建议。编制分项和主要工序的技术作业指导书(技术交底书),并向项目质安部,工程技术人员和作业班组进行技术交底,做到每个工序施工前,做法明确,质量验收标准清楚。。

(2)、工序控制作为质量控制重点

本工程每道工序施工完毕,经自检合格,报请监理、业主验收后方才进行下一道工序的施工,程序控制完善。

(3)、做好原材料及试块送检,确保工程质量

本工程对进场原材料如水泥、砂、碎石及时送检,并做好混凝土试块、砖试块的见证取样送检工作,经质检部门检验合格,详见质量保证资料。

(4)、质量纠正预防(处理)措施及时

技术部门根据质安部的反映的施工质量现状,工程部针对存在的问题召开质量分析会,制定纠正预防(处理)措施,并指导作业队实施,质检员检查实施情况和整改效果。

(5)、工程质量检查-验收-评定程序规范

①、工程质量评定:

作业班组进行自检——施工员评定——质检员核定——报监理验收

②、任务质量评定:

工序完毕,根据验收程序和制度,质检员与作业班组共同检查质量现状,并评定等级,并建立评定数据档案。

2、材料质量控制全面

进场材料与材料的质保书同行,进场时材料状态标识齐全,外观检查合格。进场后见证取样检测,合格后再使用。

3、资料管理规范齐全

工程技术部负责项目质量管理,保证资料的收集、整理和保存,并确保和工程进度同步,资料员定期通报资料整理情况和存在的问题。督促相关责任人规范及时填写。收集资料情况详见工程质量控制资料核查记录。

4、质量信息管理有序

本工程项目部,建立质量检查月报:加强质量抽检资料的收集、汇总、统计、分析、传递,加强质量通病的预防措施技术交底;及时下发质量改通知要求。

5、质量奖惩,保证质量提高

项目部授权质检人员,根据作业班组完成的质量现况,进行质量奖惩:在施工过程中,凡工程实测合格率低于项目部制定的质量保证计划的要求,观感不合格,对“工程质量隐患通知书”置之不理,质量意识单薄,质量通病不有效整改,自检不力,记录数据不真实的进行处罚。对施工部位被评为样板,分项工程被业主、监理多次提出表扬者,给予奖励。

三、安全文明施工目标实现

1、项目部根据工程的特点,制定了确保施工安全的安全管理体系,过程中始终贯彻先安全,后生产的原则。坚持预防为主,过程加强检查,督促整改,保证施工安全目标无事故发生。

2、文明施工按“标准”要求进行布置管理,做到封闭施工,场内设施齐全,标识清楚。

四、环境保护措施

为了保护环境,本项目部设置专人清运垃圾,清理垃圾时,先洒水,再装入加盖的斗车内集中运至指定的地点,防止扬尘。工地四周场地,设置专人清扫,对花、草、树定人洒水。保持洁净,出入道路口设置冲洗沟,积水坑, 防止废渣、废水外流。施工中尽量减轻扰民噪声,基本做到夜间不施工。

五、工程总结

施工组织充分,质量管理强化过程控制、检查、验收、评定完善,安全管理到位,文明施工达标,环境保护有力,工程质量合格。

巴东县兴华建筑工程有限公司

20xx年x月

相关推荐