http://www.javaworld.com/javaworld/javatips/jw-jav

阅读更多

www.javaworld.com上发现一篇好文章,译了一下,关于GC的!

03-09

J2SE 1.4.1 增强垃圾收集rnrn 在J2SE 1.4.1以前,编写有效的需要大容量吞吐量或者最小化的暂停时间的应用程序对于Java开发人员被证明是一件困难的工作。现在,针对这种类型的应用程序,1.4.1的版本特别提供了三种新的垃圾收集算法。rn rn 一个非常有用的比喻:rn 想象一下你生活在一个真实的小镇上,镇上有一条主要的街道,居民们漫步在这条街上,留下了大量的垃圾如果皮等,为此,镇里雇佣了一个全职的垃圾收集员来解决这问题。rn现在,想象一下你就是这个垃圾收集员,你开着你的垃圾车,收拾街上留下的垃圾。但是,你的垃圾车很大,所以在你收集垃圾的时候,其他的车辆不能在该街道通上通过。镇上的居民开始抱怨,他们在垃圾车通过的时候干不了任何的事情。你也尽量的想让出道来,因为有时候,一些车像救护车,救火车必须得通过。rn为了缓解这种状况,镇上的议会决定增加更多的街道从而当垃圾车在工作的时候人们可以使用他们自己的道,同时他们也决定购置更多的垃圾车以便让垃圾收集工作可以在更少的时间内完成。rn 在思考Java垃圾收集原理时这是一个非常有用的比喻。应用程序线程和垃圾收集线程共享一个单独的CPU(街道),而且,在垃圾收集器进行工作的时候应用程序的所有活动都必须停止。你可以通过增加更多的CPU或者增加更多的垃圾收集线程(垃圾车)来让垃圾收集工作进行的更快。rn 垃圾收集是一个复杂的课题。在我们讨论新的垃圾收集算法时,我们应该先了解一下在J2SE1.4.1以前Java垃圾收集器的历史。这样会让我们更容易的理解现在的垃圾收集机制。rn rn 历史背景:rn 在Java最初设计的时候,JDK附带了一个“标记-清除”(Mark-Sweep)垃圾收集器。一个“标记-清除”垃圾收集器分两步进行。rn 1,标记:标记垃圾对象。rn 2,清除:回收垃圾对象的内存空间。rn 垃圾对象的确定是通过从当前的应用程序栈空间开始遍历对象引用,不能取得的对象被认定为是垃圾。rn 标记和清除是一种“停止”式的垃圾收集技术。所有的应用程序线程会被停止直到垃圾收集工作结束。或者一个更高级别的线程中断了垃圾收集器。假如垃圾收集器被中断,它必须被重新启动,这会导致应用程序无缘无故地逆行。另外的问题是有些应用程序无法承受这样的行为,尤其是那些有着大容量面向交易客户的应用程序。rn 因为这些问题,Sun的 Java HotSpot 虚拟机将堆划分成三块区域同时用了三种垃圾收集技术。将堆进行拆分的目的是允许为新建立的对象和旧对象使用不同的算法。 这种技术是因为大多数的Java对象是生命周期较短的对象。堆的三个块区域为:rn 1,持久空间:用于JVM的类和方法对象。rn 2,旧对象空间:用于那些建立了有一段时间的对象。rn 3,新对象空间:用于新建立的对象。rn 新对象空间被进一步划分成3个子区域:rn 1,Eden:所有的新建立的对象存储处。rn 2,Survivor Space 1 或 2:在新对象成为旧对象之前的对象存储处。rn rn J2SE1.3使用的垃圾收集技术:rn 1,拷贝-整理Copy-Compaction:用于新对象rn 2,标记-整理Mark-Compaction:用于旧对象,类似于标记-清除,标记-整理标记所有的不能获取的对象;在第二步,所有不能获取的对象被清除。这种技术在垃圾收集器频繁需要运行的时候工作的非常好同时可以避免分段的问题。rn 3,递增式的垃圾收集(可选):递增式的垃圾收集器在堆中创建了一个新的区域,该区域被分成多个段,在某个时刻,每段的垃圾被回收。这为垃圾收集提供了相对少,更频繁的暂停,但是这会降低整个应用程序的性能。可以用 - Xincgc的命令行选项来指定这种方式。rn 所有的这些技术都是停止式的技术。虽然递增式垃圾收集技术使这种停止变得相对不明显,应用程序仍然需要停止。这对那些不能承受垃圾收集的这种暂停的应用程序是一个问题。rn 垃圾收集的机制是基于活动对象的;也就是说,这些活动的对象是从当前的栈空间处能够获取得到的。活动对象从新对象空间被拷贝到“Survivor-Space"(1 或 2),然后被拷贝到旧对象空间。用命令行的选项可以控制对象在"Survivor-Space"的停留时间。rn 垃圾收集器一般以较底的优先级线程运行,尝试在应用程序空闲的时候工作并进行收集工作。这对那些经常会有空闲时间的应用程序(如GUI驱动的应用程序)来说不会有什么问题。不幸的是,假如没有空闲或者极少有空闲,垃圾收集器也许旧得不到机会运行。rn 当堆的子区域接近满的情况下,垃圾收集线程会被触发。在这种情况下,垃圾收集线程的级别会增高,这同时会增加垃圾收集工作运行结束的机会。假如新对象空间满的话,会触发一个相对来说较小的收集线程。假如旧对象空间满的话,会触发一个大的收集线程。小收集线程的工作步骤是这样的:rn 1,从Eden处拷贝对象到Survivor-Space(1 or 2)。rn 2,从space 1拷贝到space 2,在拷贝了数次以后(用命令行控制),对象的状态变成被占有。rn 3,被占有状态的对象从space 1 或 2 被移到旧对象空间。rn 一个大的收集线程使用旧空间垃圾收集器(标记-整理 J2SE1.3)来回收旧对象。rn rn J2SE 1.4.1中的垃圾收集rn一些应用程序如大容量交易处理的程序不能承受垃圾收集工作造成的停止。新的1.4.1的算法对此做了补充。rn新的算法基于大多数的用于运行大吞吐量的程序的机器一般都拥有大容量的内存和多个CPU。rn rn J2SE1.4.1提供的三种新的垃圾收集算法:rn 1,并行拷贝算法。rn 2,并行清扫算法。rn 3,并发式收集算法。rn 并行(多线程)的算法被优化用于多CPU的机器中,在J2SE1.4.1中,它被用在新对象空间中。使用多线程允许垃圾收集线程与应用程序线程并行地工作,使应用程序感觉不到暂停。并行垃圾收集器为每个CPU分配一个垃圾收集线程。请注意:假如你只有一个CPU,请不要使用这种算法。rn 并行清扫垃圾收集器的算法被优化用于具有大容量的堆空间的机器中。它提供了非常快速的吞吐量。这种算法要求在旧对象空间采用标记-整理(mark-compact)算法。rn 并发垃圾收集器工作在旧对象空间。它把垃圾收集分为6个步骤:rn 1,初始表记rn 2,标记rn 3,预清除rn 4,重标记rn 5,清除rn 6,重置rn 第一步和第四步是停止式的技术;其他的步骤可以与应用程序线程并行运行。这种多步骤的垃圾收集方式使得停止式的步骤变得尽可能的短,换句话说,这也最小化了垃圾收集造成的暂停时间。rn rn 控制1.4.1垃圾收集:rn使用命令行的开关来使用垃圾收集的算法。开关如下:rn Copying [缺省]rn -XX: +UseParNewGC:并行拷贝rn -XX: +UseParallelGC:并行清扫rn -Xincgc:递增式rn [None] Mark-Compact [缺省]rn -XX: +UseConMarkSweepGC:并发标记和清除rnrn 如何选择一个垃圾收集算法:rn对大多数Java程序来说,缺省的算法可以工作的很好。假如你的应用程序的性能良好,没有必要使用另一种GC的算法。rn假如只有一个CPU,尝试使用递增式的垃圾收集器。这会对感性性能有帮助。请记住对于客户应用程序来说,感性性能相对真实性能来说更重要。假如递增式的垃圾收集没有帮助,同时你拥有大量的内存,试试用并发式的垃圾收集器。假如你有多个CPU的机器,尝试用并行垃圾收集算法的其中一个。这些算法在这种环境中作用明显。假如你有大量的内存,使用清扫式的收集器。否则,使用拷贝收集器。rn一般情况下,没有必要去改变堆的大小或并行参数的设置。但是,在当前的垃圾收集算法环境下应用程序表现出来的性能非常糟糕的话,一些更改是在所难免的。请记住确认你在进行任何更新的之前和之后做好了程序的存档。rn新的垃圾收集算法能够有效地提高应用程序的性能,特别是对那些要求大容量吞吐能力的系统。并发式的垃圾收集器被优化成针对具有大容量的堆(达到G以上)空间的机器。并行式的垃圾收集算法被优化成针对多CPU的机器。清扫式的垃圾收集器被优化成针对具有大容量的堆空间而且是多CPU的系统。rnrn选择一个有效的垃圾收集算法非常具有技巧性。在进行任何更改之前,请确认你已经备份或存档过你的系统或程序。rn rnrnrn rn文章来源:http://www.javaworld.com/javaworld/jw-03-2003/jw-0307-j2segc.html?rn rnrn

掌握Merlin新的IO类--javaworld部分原文翻译.

07-04

小弟第一次尝试翻译英语原文,呵呵,由于E文太次,只翻译了一个前言,抱歉.rnhttp://www.javaworld.com/javaworld/jw-09-2001/jw-0907-merlin-p1.htmlrnrn掌握Merlin新的IO类rnrn简介rnJ2SE1.4版(Merlin版)带来了数百个新类.这篇文章带你感受新IO库的能力:无阻塞I/O,字符变换,内存文件rnrn影射,缓冲区管理.使用新的IO库你将可以在WEB服务器上用三个线程支持数千个连接.rnrn在新发布的J2SE1.4测试版中,SUN再一次发布了大量的类,接口和新特性.因为J2SE1.3仅仅关注于性能的改rnrn进,而J2SE1.4则增加了这2年来的新的特性.同时,第一次考虑了JAVA社区(JCP)的意愿,Merlin反映出了比rnrn以前的SDK更广泛的特性.rnrn新IO包 java.nio.* 允许JAVA应用程序在保持可扩展性和高性能的同时处理数千个连接.这个包由4个核心rnrn的抽象.rn1.Buffer类,在线性序列中容纳可读写的数据.rn2.Charset从字节序列中影射Unicode字符串.(这是第三次对character的改变)rn3.ChannelS,她可以是sockets,文件,管道,提供双向的通信联系rn4.SelectorS在多线程IO操作中进行同步rnrn简短回顾rn在我门进入新IO的世界之前,让我们回顾一下IO的老风格,考虑一下基本的网络操作.它需要监听一个端口,rnrn允许进入的连接,然后为每个连接服务,假设服务一个连接需要读一个请求并返回一个响应,类似WEB的服务rnrn.在同意一个新连接accept conn到关闭这个连接close conn之间,服务程序被阻塞了rnopen socket-----accept conn---read----send ---- close connrn以下的部分从略.rn

没有更多推荐了,返回首页