资源描述:
《java 垃圾收集机制研究》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Java垃圾收集机制研究垃圾收集机制研究杨兆楠张枢摘要:Java语言使用最广泛地依赖于垃圾收集的编程语言,垃圾收集的实现是保证Java虚拟机JVM卓越性能的关键。分析了JVM所使用的垃圾收集策略、不同垃圾收集策略对性能的影响,阐述如何才能帮助垃圾收集器取得更好的性能。关键词:Java虚拟机垃圾收集器垃圾收集算法中图分类号:TP312文献标识码:A0引言Java语言中一个显著的特点就是引入了垃圾收集(GarbageCollection,简称GC)机制。垃圾收集是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收,在JVM中这一部分功能
2、和算法相应地被称为垃圾收集器(Garbagecollector),垃圾收集的好处是无可争辩的,可靠性提高、使内存管理与类接口设计分离,并使开发者减少了跟踪内存管理错误的时间。悬空指针和内存泄漏问题在Java程序中再也不会发生了Java程序可能会出现某种形式的内存泄漏,更精确地说是非故意的对象保留,但是这是一个不同的问题。但是垃圾收集机制是有代价的,其中包括对性能的影响、暂停、配置复杂性和不确定的结束。同时不同类型的应用程序对于垃圾收集有不同的要求,例如实时应用程序会要求收集暂停的持续时间短并且有限制,而企业应用程序可能允许更长时间和可预测性更低的暂停以获得更高的吞吐量。因此Ja
3、va开发人员有必要充分了解Java的这一内部机制,理解了JVM支持的垃圾收集算法和应用程序对性能的要求,便可以有效地对GC进行优化,提高整个应用程序的性能。本文将分析JVM所使用的垃圾收集策略、不同垃圾收集策略对性能的影响和如何才能帮助垃圾收集器取得更好的性能。1GC算法分析任何一种垃圾收集算法所面临的问题是相同的——找出由分配器分配的但是用户程序不可到达的内存块进行回收。1.1基本算法1引用计数ReferenceCounting算法最直观的垃圾收集策略是引用计数。每一个对象都有一个关联的引用计数,表示连接该对象的活跃引用的数量。当有引用连接至对象时,引用计数加1,当引用离开作
4、用域或置为null时,引用计数减1。如果对象的引用计数是零,那么它就是垃圾,用户程序不可到达它,并可以回收。这一算法在执行垃圾收集任务时速度较快,但管理引用计数的开销在整个程序生命周期中将持续存在。更重要的是引用计数算法无法正确释放循环引用的内存块。引用计数常用来说明垃圾收集的工作方式,它从未被应用于任何一种JVM实现中。2标记——清除Mark-Salstyle="MARGIN:0cm0cm0pt;TEXT-INDENT:24pt;mso-char-indent-count:2.0">标记——清除Mark-Salstyle="MARGIN:0cm0cm0pt;TEXT-INDE
5、NT:24pt;mso-char-indent-count:2.0">3复制Copying算法复制算法把整个堆分成相等的两块。在任意时刻,只有其中的一块用于分配对象,另一块是空的。在垃圾收集时,用于分配对象的一块称为源块,空的一块称为目的块,所有从根对象出发可及的对象都从源块拷贝到目的块,在下一次垃圾收集时,源块和目的块互换。这种方法效率很高,而且不存在内存碎片,缺点是被分配的内存只有一半是可用的,一半是空闲的,长寿的对象在每次收集时都要来回复制。4标记整理Markpact算法标记整理算法是标记清除算法和复制算法的有机结合。标记整理是两阶段过程,在标记阶段访问并标记每个活跃对象
6、。然后,复制标记的对象,使所有活跃对象被整理到堆的底部。如果每一次收集时进行彻底的整理,那么得到的堆就类似于复制收集器的结果,在堆的活跃部分与自由部分有明确的界线,这样分配成本与复制收集器相当。长寿的对象趋向于沉在堆的底部,这样就不会像在复制收集器中那样反复复制它们。实验表明,标记整理算法的总体执行效率高于标记清除算法,又不像复制算法那样需要牺牲一半的存储空间。1.2JavaHotSpot虚拟机的GC算法随着科学研究和应用实践的不断深入,人们逐渐意识到,一个理想的垃圾收集器不应在运行时导致应用程序的暂停,不应额外占用大量的内存空间和CPU资源,而上述的垃圾收集算法都无法满足这些
7、要求。人们必须提出更新的算法或思路,以解决实践中碰到的诸多难题。SUN公司在每次发布的新版JDK中都为其中的垃圾收集器做了一些改进。以下主要讨论HotSpotJVM出现以后的GC算法。JVM1.2及以后版本使用的技术称为分代垃圾收集generationalgarbagecollection,这种方法是基于一个事实,绝大多数对象是生命周期较短的对象。虚拟机将堆划分为两部分,一个年老代,用于存放生存期比较长的对象;一个年轻代,用于存放新建的且生存期短暂的对象实际上,还有第三部分,永久空间,用于存