小妖女 发表于 2015-1-18 11:31:44

JAVA编程:剖析JDK 7的Garbage-First搜集器仓酷云

你对java乐观有点盲目。java的关键就是在服务器上表现优异,而且它提供了整个开发所需要的工具。应该是说,看哪天。net网页编程有没有机会赶上java。Garbage-First(后文简称G1)搜集器是现今搜集器手艺开展的最前沿功效,在Sun公司给出的JDKRoadMap内里,它被视作JDK7的HotSpotVM的一项主要退化特性。从JDK6u14中入手下手就有EarlyAccess版本的G1搜集器供开辟职员实行、试用,固然在JDK7正式版公布时,G1搜集器仍旧没有挣脱“Experimental”的标签,可是信任不久后将会有一个成熟的商用版本跟从某个JDK7的更新包公布出来。
因版面篇幅限定,笔者行文过程当中假定读者对HotSpot其他搜集器(比方CMS)及相干JVM内存模子已有基础的懂得,触及到基本观点时,没有再延长先容,读者可参考相干材料。
G1搜集器的特性

G1是一款面向服务端使用的渣滓搜集器,Sun(Oracle)付与它的任务是(在对照临时的)将来能够交换失落JDK5中公布的CMS(ConcurrentMarkSweep)搜集器,与其他GC搜集器比拟,G1具有以下特性:


[*]并行与并发:G1能充实使用多CPU、多核情况下的硬件上风,利用多个CPU(CPU大概CPU中心)来延长Stop-The-World停留的工夫,部分其他搜集器底本必要停留Java线程实行的GC举措,G1搜集器仍旧能够经由过程并发的体例让Java程序持续实行。
[*]分代搜集:与其他搜集器一样,分代观点在G1中仍然得以保存。固然G1能够不需其他搜集器共同就可以自力办理全部GC堆,但它可以接纳分歧的体例去向理新创立的对象和已存活了一段工夫、熬过量次GC的旧对象以猎取更好的搜集效果。
[*]空间整合:与CMS的“标志-清算”算法分歧,G1从全体看来是基于“标志-收拾”算法完成的搜集器,从部分(两个Region之间)上看是基于“复制”算法完成,不管怎样,这两种算法都意味着G1运作时代不会发生内存空间碎片,搜集后能供应规整的可用内存。这类特征有益于程序长工夫运转,分派年夜对象时不会由于没法找到一连内存空间而提早触发下一次GC。
[*]可展望的停留:这是G1相对CMS的别的一年夜上风,下降停留工夫是G1和CMS配合的存眷点,但G1除寻求低停留外,还能创建可展望的停留工夫模子,能让利用者明白指定在一个长度为M毫秒的工夫片断内,损耗在渣滓搜集上的工夫不得凌驾N毫秒,这几近已是及时Java(RTSJ)的渣滓搜集器特性了。
完成思绪

在G1之前的其他搜集器举行搜集的局限都是全部重生代大概老年月,而G1不再是如许。利用G1搜集器时,Java堆的内存结构与就与其他搜集器有很年夜不同,它将全部Java堆分别为多个巨细相称的自力地区(Region),固然还保存有重生代和老年月的观点,但重生代和老年月不再是物理断绝的了,它们都是一部分Region(不必要一连)的汇合。
G1搜集器之以是能创建可展望的停留工夫模子,是由于它能够有企图地制止在全部Java堆中举行全地区的渣滓搜集。G1跟踪各个Region内里的渣滓聚积的代价巨细(接纳所取得的空间巨细和接纳所需工夫的履历值),在背景保护一个优先列表,每次依据同意的搜集工夫,优先回代价最年夜的Region(这也就是Garbage-First称号的出处)。这类利用Region分别内存空间和有优先级的地区接纳体例,包管了G1搜集器在无限的工夫内获能够猎取尽量高的搜集效力。
G1把内存“化整为零”的思绪,了解起来仿佛很简单了解,但个中的完成细节却远远没有征象中复杂,不然也不会从04年Sun实行室宣布第一篇G1的论文拖至今快要8年工夫都还没有开辟出G1的商用版。笔者举个一个细节为例:把Java堆分为多个Region后,渣滓搜集是不是就真的能以Region为单元举行了?听起来水到渠成,再细心想一想就很简单发明成绩地点:Region不成能是伶仃的。一个对象分派在某个Region中,它并不是只能被本Region中的其他对象援用,而是能够与全部Java堆恣意的对象产生援用干系。那在做可达性判断断定对象是不是存活的时分,岂不是还得扫描全部Java堆才干保证正确性?这个成绩实在并不是在G1中才有,只是在G1中加倍凸起了罢了。在之前的分代搜集中,重生代的范围一样平常都比老年月要小很多,重生代的搜集也比老年月要频仍很多,那接纳重生代中的对象也面对过不异的成绩,假如接纳重生代时也不能不同时扫描老年月的话,MinorGC的效力大概下落很多。。
在G1搜集器中Region之间的对象援用和其他搜集器中的重生代与老年月之间的对象援用,假造机都是利用RememberedSet来制止全堆扫描的。G1中每一个Region都有一个与之对应的RememberedSet,假造机发明程序在对Reference范例的数据举行写操纵时,会发生一个WriteBarrier临时中止写操纵,反省Reference援用的对象是不是处于分歧的Region当中(在分代的例子中就是反省引是不是老年月中的对象援用了重生代中的对象),假如是,便经由过程CardTable把相干援用信息纪录到被援用对象所属的Region的RememberedSet当中。当举行内存接纳时,GC根节点的列举局限中到场RememberedSet便可包管不合错误全堆扫描也不会有漏掉。
运作历程

假如不盘算保护RememberedSet的操纵,G1搜集器的运作大抵可分别为以下几个步骤:


[*]初始标志(InitialMarking)
[*]并发标志(ConcurrentMarking)
[*]终极标志(FinalMarking)
[*]选择接纳(LiveDataCountingandEvacuation)
对CMS搜集器运作历程熟习的读者,必定已发明G1的前几个步骤的运作历程和CMS有良多类似的地方。初始标志阶段仅仅只是标志一下GCRoots能间接联系关系到的对象,而且修正TAMS(NextTopatMarkStart)的值,让下一阶段用户程序并发运转时,能在准确可用的Region中创立新对象,这阶段必要停留线程,但耗时很短。并发标志阶段是从GCRoot入手下手对堆中对象举行可达性剖析,找出存活的对象,这阶段耗时较长,但可与用户程序并发实行。而终极标志阶段则是为了修改并发标志时代,因用户程序持续运作而招致标志发生变化的那一部分标志纪录,假造机将这段工夫对象变更纪录在线程RememberedSetLogs内里,终极标志阶段必要把RememberedSetLogs的数据兼并到RememberedSet中,这阶段必要停留线程,可是可并行实行。最初选择接纳阶段起首对各个Region的接纳代价和本钱举行排序,依据用户所希冀的GC停留工夫来制订接纳企图,从Sun泄漏出来的信息来看,这个阶段实在也能够做到与用户程序一同并发实行,可是由于只接纳一部分Region,工夫是用户可把持的,并且停留用户线程将年夜幅进步搜集效力。经由过程能够对照分明地看到G1搜集器的运作步骤中并发和必要停留的阶段。

<br>
G1搜集器运转表示图
G1搜集器的实践功能

因为今朝还没有成熟的版本,G1搜集器几近能够说还没有经由实践使用的磨练,网上关于G1搜集器的功能测试十分枯窘,笔者没有Google到有关的临盆情况下的功能测试呈报。夸大“临盆情况下的测试呈报”是由于关于渣滓搜集器来讲,仅仅经由过程复杂的Java代码写个Microbenchmark程序来创立、移除Java对象,再用-XX:+PrintGCDetails等参数来检察GC日记是很难做到准权衡其功能的(为什么Microbenchmark的测试了局禁绝确可拜见笔者这篇博客:http://icyfenix.iteye.com/blog/1110279)。因而关于G1搜集器的功能部分,笔者援用了Sun实行室的论文《Garbage-FirstGarbageCollection》个中一段测试数据,和一段在StackOverfall.com上偕行们对G1在实在临盆情况下的功能分享会商。
Sun给出的Benchmark的实行硬件为SunV880服务器(8

再见西城 发表于 2015-1-21 09:33:34

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

愤怒的大鸟 发表于 2015-1-30 13:31:14

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

第二个灵魂 发表于 2015-2-6 12:49:23

是一种将安全性(Security)列为第一优先考虑的语言

兰色精灵 发表于 2015-2-16 03:09:56

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

不帅 发表于 2015-2-28 19:23:05

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

小女巫 发表于 2015-3-3 03:22:34

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

活着的死人 发表于 2015-3-11 05:44:48

Java是一种计算机编程语言,拥有跨平台、面向对java

灵魂腐蚀 发表于 2015-3-12 09:25:53

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

简单生活 发表于 2015-3-15 15:41:30

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

柔情似水 发表于 2015-3-22 01:55:02

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

若天明 发表于 2015-3-31 19:05:55

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

只想知道 发表于 2015-4-6 13:04:57

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。

乐观 发表于 2015-4-6 21:21:07

应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展

山那边是海 发表于 2015-4-10 19:50:06

是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言

爱飞 发表于 2015-4-26 09:10:42

其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。

小妖女 发表于 2015-4-28 04:49:10

是一种语言,用以产生「小应用程序(Applet(s))

谁可相欹 发表于 2015-5-2 20:53:22

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

透明 发表于 2015-6-9 12:55:05

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

飘灵儿 发表于 2015-6-21 10:21:15

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
页: [1]
查看完整版本: JAVA编程:剖析JDK 7的Garbage-First搜集器仓酷云