(计算机软件与理论专业论文)垃圾收集器中大对象管理及显式内存管理的研究.pdf_第1页
(计算机软件与理论专业论文)垃圾收集器中大对象管理及显式内存管理的研究.pdf_第2页
(计算机软件与理论专业论文)垃圾收集器中大对象管理及显式内存管理的研究.pdf_第3页
(计算机软件与理论专业论文)垃圾收集器中大对象管理及显式内存管理的研究.pdf_第4页
(计算机软件与理论专业论文)垃圾收集器中大对象管理及显式内存管理的研究.pdf_第5页
已阅读5页,还剩56页未读 继续免费阅读

(计算机软件与理论专业论文)垃圾收集器中大对象管理及显式内存管理的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 现代的编程语言( j a v a 、c 拌、r u b y 、j a v a s c r i p t 等) 往往都使用自动的内存管 理技术,使用垃圾收集器来负责内存空间的管理,程序员只负责分配内存,无 需关注内存的回收工作,内存的回收工作交由垃圾收集器动态地完成。由于内 存管理的重要性,使得垃圾收集器成为运行时系统中的一个重要组成部分,另 外垃圾收集器的性能对应用程序的执行有很大的影响,故对垃圾收集器性能的 研究具有重要的应用价值。 本文针对当前垃圾收集器在大对象的管理技术以及即时编译器辅助的内存 管理技术中的缺陷,以h a n n o n y ( a p a c h e 组织丌发的j a v a 虚拟机实现) 为平台, 重点研究了垃圾收集器中大对象的管理算法和垃圾收集器对即时编译器辅助的 内存管理技术的支持。在h a 肋o n y 的垃圾收集器g c v 5 中提出了一个新的能够 高效管理大对象的垃圾收集算法p a c k e r 的实现,同时给出了一个支持即时编译 器辅助的并行垃圾收集算法j i tg c m s 的实现。 围绕着垃圾收集器中大对象的管理及对即时编译器辅助内存管理技术的支 持,本文重点完成了以下工作: 1 、深入研究了j a v as e 项目a p a c h eh a r m n y 中的垃圾收集模块g c v 5 ,并 为g c v 5 设计和实现了一个日志输出系统。 为了在g c v 5 上开展本文的工作,我们对g c v 5 做了深入的调研,总结了 g c v 5 的代码组织、堆空间布局、堆空间管理、算法中的并行特性及对外的主要 接口。另外,为了使得用户和开发人员了解运行应用程序时垃圾收集器内部运 行的细节,我们为g c v 5 设计并开发了一个日志输出系统。 2 、深入研究大对象的管理,在g c v 5 中提出并实现了一个新的高效管理大 对象的并行垃圾收集算法p a c k e r 。 我们提出的p a c k e r 算法是传统大对象管理算法的超集,不需要单独的空间 来管理大对象,且整个算法都是并行的。p a c k e r 能够动态地决定是否紧压大对象, 从而在紧压算法和标记清扫算法之间动态地选择最有利的策略,这样即涵盖了 传统大对象管理算法的优点,同时又避免了它们的缺点。 3 、基于g c v 5 中的g c m s 算法,提出并实现了一个支持对象显式回收操作 的并行垃圾收集器。 摘要 本文实现的垃圾收集器不仅能够支持显式的对象回收操作,且可以及时有 效地重用同收的对象空间。实验结果表明,我们实现的垃圾收集器能够重用几 乎所有的、显式回收的对象空l 旬,显著地提高了j a v a 应用程序的执行效率。 4 、 在即时编译器和虚拟机核心模块中添加对象显式回收操作的支持。 为了开展即时编译器辅助的垃圾收集技术,我们分别在即时编译器中的 h i r 、l i r 、代码选择器、代码发射器中增加了对显式回收操作的支持。l 司时存 虚拟机核心模块中添加运行时的支持将回收指令涮用映射到垃圾收集器提供的 对象回收接口。 关键词:垃圾收集器;即时编泽器;大对象管理;并行紧压算法;显式内存管 理 a b s t r a c t d y n a m i c a l l ya n dt h ec o m p a c t i o naj g o r i t h mf o rl a r g eo 巧e c t si sp a r a l l ej t ot h eb e s to f o u rk n o w i e a g e ,i ti st h en r s tp a r a l l e ic o m p a c t i o na l g o r i t h mf o rl a r g eo b j e c t i th a st h e a d v a n t a g e so ft h et r a d i t i o n a la i g o r i t h m s ,a n da v o i d st h e i rd i s a d v a n t a g e s 3 b a s e do nt h eg c - m sa i g or i t h mi ng c v 5 ,w ep r e s e n ta n d i m p l e m e n t a p a 阳e ig a r b a g e c o i i e c t o rw i t hj u s t n t i m ec o m p i i e r a s s i s t a n c e w ei m p i e m e n tap a r a i l e ig a r b a g ec o l i e c t o rw i t hj u s t - i n - t i m ec o m p i i e ra s s i s t a n c e ( j i t a s s i s t e dg c ) i nh a m o n y ,w h i c hi sa b l et of r e eo b j e c t se x p l i c i t l yb yi n s e r t i n gt h e ”矗- e e ”i n s t r u c t i o n si nc o m p 1 a t i o nt i m e t h ej i t - a s s i s t e dg ca d v a n c e si nt h a ti t s i g n i 矗c a n t l yi n c r e a s e st h er e u s a b il t yo ft h er e c l a i m e do b j e c ts p a c e ,t h u si m p r o v e st h e f n e m o r yu t il i t ya n de x e c u t i n ge f f i c i e n c yo f j a v aa p p li c a t i o n s 4 a d dt h es u p p o r tf o re x p c i to b j e c tf r e eo p e r a t i o ni nj l t r i n oa n d c o r e w ea d dt h ef 沁ei n s t r u c t i o ni nh i ra n dl i rt os u p p o r tt h ee x p l i c i tf e eo p e r a t i o n w ea l s om o d i vt h ec o d es e l e c t o ra n dc o d ee m i t t e rt os u p p o nt h ef r e ei n s t r u c t i o n a d d i t i o n a l l y ,w ea d dt h er u n t i m es u p p o r ti nv m c o r et om a p t h ef r e ei n s t r u c t i o ni n t o 矗ei n t e r f a c es u p p o n e db yg a r b a g ec o i i e c t o r k e y w o r d s :g a r b a g ec o i l e c t o r ;j u s ti n t i m ec o m p i l e r ;l a r g eo b j e c tm a n a g e m e n t ; p a r a l l e lc o n :l p a c ta i g o r i t h m ;e x p l i c i tm e m o 呵m a n a g e m e n t ; i v 中国科学技术大学学位论文原创性和授权使用声明 本人声明所呈交的学位论文,是本人在导师指导下进行研究工作 所取得的成果。除已特别加以标注和致谢的地方外,论文中不包含任 何他人已经发表或撰写过的研究成果。与我一同工作的同志对本研究 所做的贡献均已在论文中作了明确的说明。 本人授权中国科学技术大学拥有学位论文的部分使用权,即:学 校有权按有关规定向国家有关部门或机构送交论文的复印件和电子 版,允许论文被查阅和借阅,可以将学位论文编入有关数据库进行检 索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。 保密的学位论文在解密后也遵守此规定。 作者签名:墨签塑螫 。男年厂月碣日 第l 奉绪论 第l 章绪论 垃圾收集( g a r b a g ec o l l e c t i o n ) 是一种十分“古老”的技术,它与l l s p 语言 一起出现在上世纪的6 0 年代,时至今日,垃圾收集已经成为了一种在主流的软 件开发领域中得到普遍应用的技术。现代的编程语言( j a v a 、c 牟、r u b y 、j a v a s c r i p t 等) 往往都使用垃圾收集器( g a r b a g ec o l l e c t o r ,简称g c ) 来负责内存空间的管理。 程序员仍然需要申请动态分配内存,但不再需要决定何时释放那块内存了,内 存的回收工作交由垃圾收集器动态地完成。垃圾收集器带来的好处是显而易见 的,使用垃圾收集器不需要程序员手工的释放内存,人人简化了程序员的负担, 且避免了内存泄漏和不正确的内存释放操作引起的程序错误。 1 1 问题描述 虽然垃圾收集器带来了很多的好处,但其本身也需要占用内存空i 日j ,消耗 c p u 资源,会对应用程序的执行带来巨大的性能开销。从垃圾收集技术出现的 那一刻开始,垃圾收集器的开销就为人们所关注,上世纪7 0 年代到8 0 年代的 研究发现,大型的l i s p 程序在垃圾收集上的花费通常占程序执行全部时i 甘j 的 4 0 ,现代技术已经实质件地降低了垃圾收集的开销,但垃圾收集的总体执行时 间仍然在几个百分点到2 0 个百分点之间,通常在1 0 个百分点寿右。口j 以看出 垃圾收集器的性能对应用程序的执行时| 日j 有着很大的影响,故而对垃 ;5 乏收集器 算法和性能的研究,具有重要的意义。 改进垃圾收集器的性能的研究多数集中在垃圾收集本身的算法上,通过改 进原来的算法或提出新的算法米提高垃圾收集器的性能,研究者们先后提出了 多种垃圾收集算法,标记清扫算法,拷贝算法,紧压算法等。在这些垃圾收集 算法管理的对象中,有一类比较特殊的对象,它们占用的内存空间比较大,被 称之为大对象( l a 唱eo b i e c t ) 。大对象的管理具有一定的特殊。降,如,大对象的移 动成本较高,需要尽量避免对它们移动:因为不存在大对象大小的极限,故无 法在事先规定好的块( b l o c k ) 内为大对象分配空间;多数应用程序中的大对象个 数相对较少,很难事先分配固定大小的守问供大对象使用,凶为需要引入动态 调整技术不停的调整大对象空间的大小。正是于这些特殊性,使得大埘象的 管理算法很难设计。 第l 帝绪论 1 2 i 垃圾收集算法的发展 自从垃圾收集技术被提出之后,研究人员提出了多种垃圾收集算法,经典 的垃圾收集算法包含引用计数( r e f e r e n c ec o u n t i n g ) 、标记清扫( m a r k s w e e p ) 、节 点复制( c o p i n g ) 算法。针对这些算法的缺点,人们又提出了紧压 ( m a r k - c o m p a c t i o n ) 、分代( g e n e r a t i o n a i ) 收集算法。传统的垃圾收集算法都是需要 先暂停应用程序的执行,等待垃圾收集算法完成后,应用程序再继续执行。近 期的研究又提出了无停顿的垃圾收集算法,即并发垃圾收集算法( c o n c u r r e n t g c ) 。下面我们对这些算法上的相关丁作做一个简单的介绍。 标记清扫算法是第一种用于自动内存管理的算法,由m c c a n h y 在1 9 6 0 年 提出【l j 。标记清扫算法是一种基于追踪的垃圾收集算法,主要算法包含两个阶 段,标记阶段和清扫阶段。标记阶段的任务是找出堆中所有的活对象并标记, 做法是从根集( r o o ts e t ) 中的对象节点山发,沿着对象的引用域深度优先遍历整 个堆空间,所有可达的对象被认为是活对象;清扫阶段回收死l 对象占用的空 间,用于满足新的分配需求。该算法的一个土要的缺点足碎片问题,随着程序 的运行,堆空间会变得离散,出现越来越多的空隙。 引用计数算法由c o i l i n s 在1 9 6 0 乍f 提出【2 】,它的基本思想是为每个对象计算 指向它的引用的数量,当一个对象的引用计数为0 时,表明该对象不可能再被 访问到,即已经死亡,可以将它占用的内存空间归还给垃圾收集器鼋新分配出 去。该算法由于实现简单,被用于多个系统,如s m a l l t a l k 的早期版本和a d o b e p h o t o s h o p 。但是它也有一个严重的缺点,就是不能处理环形引用的情况。 复制算法最早由m a r v i nm i n s k y 在19 6 3 年提山【3 】,之后f e n i c h e l 等人【4 】和 c h e n e y l 5 j 又分别对该算法做了进一步地改进。该算法将堆分成两个半区 ( s e m i s p a c e ) ,一个包含现有的数据,一个包含已经废弁的数据。当垃圾收集运 行时,活对象从当前区拷贝到另一半区,收集完成时,另一半区只包含活对象, “垃圾”被留下来,因而另一半区成为一个新的活跃半区,内存分配从新的活 跃半区开始分配。该算法的优点是效率比较高,另外空问局部性比较好。但足 它也有一个明显的缺点,每次只能使用其中的一个半区,故空间的利用率彳i 高。 紧压算法的思想最早由t i m o t h yh a r t 和t h o m a se v a n s 在1 9 6 4 年提出【6 j ,该 算法通过紧压堆中的活对象来滕出一块大的空闲空间,主要用来解决堆中的碎 片问题。之后出现了多种紧压算法的实现【7 】【8 】【9 】,c o h e n 等人对这些算法做了详 第l 章绪论 6 4 k b 。 2 2 】比较了当前比较流行的两种不移动对象的垃圾收集算法,标记清扫 算法和b a k e r 提出的t r e a d m 1 l 算法【2 3 】,结果表明这两个算法在管理l o s 上j i :不 会带来很大的性能差别。l o s 的引入避免了移动大对象的开销,但l o s 的引入 降低了整个垃圾收集器的效率。第一,单独管理的l o s 的收集很难并行化,延 长了垃圾收集的停顿时间;第二。堆空间划分成l o s 与非l o s ,当其中一个没 有空闲空间时,就要发生垃圾收集,通常很难使得两个空| 甘j 被完全利用,降低 了堆的利用率;第三,l o s 与1 卜l o s 牢间的收集分开进行,影响了并行执行的 可扩放性。 也有一些垃圾收集器【2 4 】【1 3 1 不引入l o s ,其做法是采用标记清扫算法管理整 个堆。这种做法避免了引入l o s 带来的缺点,但也有其不可克服的缺点。第一, 标记清扫算法采用链表结构管理空闲空间,其分配效率远低于移动算法的碰推 指针( b u m p p o i n t e r ) 分配;第二,标记清扫算法不保证分配地址的顺序性, 使用该算法的访问局部性低于使用碰推指针分配的算法:第二,标记清扫算法 不紧压对象空间,会逐渐导致系统堆的碎片化,降低堆的使用效率,常常需要 引入额外的紧压算法进行碎片清理。 本文提出的p a c k e r 算法( 详见第3 章) 在一个空间罩统一管理大对象和普 通对象,避免了引入l o s 带来的丌销。在刘大对象的管理上,同时支持标记 清扫算法和紧压算法,可以存标记清扫算法和紧压算法之i h j 动态地选择最有利 的策略,是标记清扫算法和紧压算法的超集。同时本文在p a c k e r 中提出的紧压 算法刊。以并行地完成大对象的紧压,提高了紧压算法的效率。使用p a c k e r 算法 管理大对象,大部分时候采用的是标记- j 青扫算法,并不需要移动大对象,只在 少数情况下采用紧压算法管理大对象,但 1 f 于p a c k e r 算法中的紧压算法是并行, 故不会带来很大的性能丌销。故而p a c k e r 算法即涵盖了传统大对象管理算法的 优点,同时又避免了它们的缺点。 1 2 3 编译器辅助的内存管理技术 当前编泽器辅助的内存管理技术的研究工作主要有二类,( i ) 通过逃逸分析, 分析出每个方法或线程私有的对象,然后将这些刘象分配在栈上耐不是堆上:( i i ) 在编译阶段分析各个对象的生命划,为生命期不相交的对象分配同一块空间, 从而提高内存空间的重用率;( i i i ) 添加回收操作,在对象不再被引用的地方显式 地释放对象空间,从而减轻垃圾收集器的负担。 第l 章绪论 在逃逸分析上开展的工作有【2 5 】 2 8 【2 9 】【3 0 】 3l 】。j d c h o i 等人的工作【2 5 】 引入了一个称为连通图( c o n n e c t i o ng r a p h ) 的程序抽象用十确立别象、对象引用之 间的可达性。通过连通图可以很容易地为每个方法建市相关结构,这样逃逸分 析就被映射为连通图的可达性问题,它可用于静态j a v a 编泽器上下文中的对象 的栈上分配和不必要的同步消除。e r u f 的工作【28 】提出了两种新的技术剧十改进 基于相等性( e q u a i i t y - b a s e d ) 的数据流分析的精确性。该分析不仅对静态域不可到 达的对象作了同步消除,而且对只有一个线程访问的静态域可达的对象也作了 同步消除。d g a y 和b 。s t e e n s g a a r d 的工作【2 9 j 描述了j a v at m ( t r a n s a c t i o nm e m 0 9 ) 上实现的过程间的、上下文敏感的逃逸分析,并证明了其正确性,其分析是建 立在s s a ( s t a t i c s i n g l e a s s i g n m e n t ) 格式的代码之上。j w h a i e y 和m r i n a r d 的工 作【3 0 】提出并实现了在j a v a 字节码级别上的一个逃逸分析框架,l e iw a n g 和x i k u n s u n 的工作【引】提出了j a v a 上的一个非流敏感、过程间的、上下文相关的逃逸分 析框架,利用这个分析对j a v a 程序以及j a v a 库进行不必要的同步操作的消除, 并在o r p ( i n t e i so p e nr u n t i m ep i a t f o r m ) 上做出了实现。逃逸分析的缺点是并不 能立即回收可回收的空j 日j ,并目可能导致栈帧的大小特别大。 通过分析对象生命期的相交性东优化内存分配的工作有【3 2 【3 3 】。 g h e o r g h i o i u 等人的t 作【强j 提出一个程序间的分析算泫找出j a v a 程序中的兼容” 分配点( 如果两个分配点分配的对象存j 到一时刻只能有一个是活着的,那这两个 分配点就是兼容分配点) ,这样就可以为一组兼容点分配一块共享的内存空间, 该工作的限制是一组兼容的分配点分配的对象的大小必须是相同的。m a r i n o v 和 c a i i a h a n 的工作1 3 3 j 更进一步地提出称为o e p ( o b j e c te q u a l i t yp r o f i i i n g ) 的技术, 发现那些有 x 第l 章绪论 出程序中的无用对象,并自动的在合适的地点添加显式的f r e e ( o b j e c t ) 操作释放无 用对象所占据的内存空间。c h e r e m 等人的工作f 3 7 】提出一种唯一性的推理算法, 该算法结合过程内的别名分析和全局唯一性约束系统,识别出程序中具有唯一 引用的变量和对象域,然后通过添加析构器来释放这部分对象的窄间。【3 6 】和 3 7 】 优点在于能够及时的释放空间,减少无用单元收集器被唤醒的频率,但是这两 个工作的重点都集中在分析技术上,没有研究如何更好地存垃圾收集器中支持 对象的显式回收操作。 本文的工作采用即时编译器辅助垃圾收集技术,在即时编译器中添加分析 算法找出可以显式回收的对象,并添加安捅算法存它们的死广点安捅显式的对 象回收指令来显式回收对象的空间,而不是等待垃圾收集器来回收它们的内存 空间。本文的工作主要集中在垃圾收集器中,提出了一种基于即时编译器辅助 的并行垃圾收集器的实现,该收集器支持显式的对象回收操作,引入了针对显 式回收的对象空间的管理算法,可以及时有效地重用这些对象空间。 1 3 研究内容 根据前面介绍的垃圾收集技术中大对象管理及辅助内存管珲尚存在的缺 陷,本文的工作以h a r m o n y 为平台,重点研究了垃圾收集器中的大对象管理算 法和垃圾收集器对即时编详器辅助内存管理的支持。在g c v 5 上提山了一个新的 能够高效管理大对象的垃圾收集算法p a c k e r 的实现,同时给出了一个支持即时 编译器辅助的并行垃圾收集算法j i tg c m s 的实现。图1 1 给出了本文工作的 总框架及相关模块,主要涉及g c v 5 、j i t r i n o 、v m c o r e 模块。主要的研究内容 如下: 第1 帝绪论 压算法之间动态地选择最有利的策略,大部分时候并不需要移动大对象。同时 p :a c k e r 还可以用于管理分代算法g cg e n 中的成熟代空间,从而避免g cg e n 中引入l o s 的开销。关于这部分工作的框架见图1 1 中g c v 5 模块的a l g r o i t h m 部分。 3 、g c v 5 中提供显式回收操作的垃圾收集器的研究 g c v 5 中需要实现对象的显式回收接口f r e e ( ) ,i 司时能够有效地管理这些空 间,使得分配算法能够冉次将它们重新分配给新的对象。我们实现的j l tm s 中 添加了对这些对象空间的管理算法,同时修改了对象的分配操作,能够高效支 持对象的显式回收操作并日重用这部分空j h j 。见图1 1 中g c v 5 模块的 j i tg c m s 部分。 4 、j i t r i n o 和v m c o r e 模块中支持对象显式回收操作的研究 即时编译器辅助的垃圾收集技术中,j i t r i n o 中( 见图1 1 中j i t 模块里的阴 影部分) 需要研究的主要工作是:1 ) 在h l r 和l i r 中增加支持对象显式回收的指 令;2 ) 添加一个在h i r 上的优化遍,它将分析出程序中的对象乍命期信息,选 择合适的程序点安插回收指令来释放已经死亡的对象空问:3 ) 修改代码选择器, 使之支持扩展h i r 到扩展l i r 的变换;4 ) 修改代码发射器,将显式回收指令发 射为运行时的指令调用。本论文的t 作卡要研究( 1 ) ( 3 ) ( 4 ) ,t 作( 2 ) 在实验室刘玉 宇同学的毕业论文中完成。v m c o r e 中( 图1 i 中v m c o r e 模块里的阴影部分) 需要研究的主要工作是添加新的运行时支持,使得显式同收指令生成的指令调 用能够映射到垃圾收集器中提供的对象显式回收接口f r e e ( ) 。 1 4 论文组织 本文的其余部分足这样组织的: 第2 章对h a m o n y 平台做了简单的介绍,详细研究了h a r m o n y 中的圾收集 器g c v 5 并为其实现了一个日忐输出系统。 第3 章本章给出了一种新的能够高效管理大对象的并行垃圾收集算法 p a c k e r 的实现,并将其应用到在分代算法g c g e n 中管理成熟代空间。 第4 章给出了一种基于即时编译器辅助的并行垃圾收集器的实现,同时在 j i t r i n o 和v m c o r e 模块中添加对显式回收指令的支持。 第5 章对全义进行总结。 第2 章h a m o n y 平台及垃圾收集器g c v 5 的研究 模块:g c c c 和g c v 5 。前者是单线程的垃圾收集器( 垃圾收集的过程由单个线 程完成) ,后者是并行的垃圾收集器( 垃圾收集的过程可以由多个线程同时完成) 。 本文针对垃圾收集器的研究都要基于g c v 5 开展,故我们阅读了g c v 5 的所有代 码,对g c v 5 做了详细的凋研,本章对g c v 5 的实现做一个总体上的总结。g c v 5 的代码可以使用s u b v e r s i o n 工具从 4 l 】下载。 g c v 5 提供多种垃圾收集算法的实现,有并行的标记清扫算法g c m s 和分 代的垃圾收集算法g c g e n 。g c m s 对整个堆空间统一管理,不做划分。而分 代算法g c g e n 将堆空间分为幼年代空间州o s ) 和成熟代空间( m o s ) ,另外还需 要单独开辟一块大对象空间( l o s ) 管理程序中大对象的分配与回收。当前g c v 5 中使用g c g e n 作为默认的垃圾收集算法。本章首先介绍了g c v 5 的代码组织和 特点,堆空间布局、堆的管理、算法中的爿:行特性及对外的j 要接口;然后为 g c v 5 实现了一个日志输出系统。 2 1g c v 5 代码的组织结构和主要特点 2 1 1 代码的组织结构 在g c v 5 中,各代码按其用途归类放在不同的文件夹下。g c g e n 中三个子 空间有各自的管理算法,其对外封装实现细节,只提供接口,然后外面再利用 各子空间算法提供的接口实现分代算法对整个堆进行管理。g c v 5 将这些算法具 体的实现代码封装在各自的文件包中,好处一是方便别人阅读,- 二是有助十分 代算法的可扩展性。 针对堆空间的二个子窄间l o s 、m o s 、n o s ,分别使用二种不i 一的算法米 管理,依次为m a r ks w e e p 算法、m a r kc o m p a c t 算法、t r a c ef o r w a r d 算法。它们 的代码分别放在i o s 、m a r kc o m p a c c 、t r a c ef o n v a r d 文件夹下,文件夹的取名采 用的是算法的名称( 1 0 s 除外,因为m a r k s w e e p 目录被用米存放并行的标记清扫 算法g c m s 的实现) 。而后,利用上面三种算法编写了分代垃圾收集算法g c g e n 来管理整个堆空间,代码放在g e n 文件夹下。m a r k s w e e p 目录存放并行标记清 扫算法g c m s 的实现。 c o m m o n 文件夹下包含了上述算法共用的代码,t h r e a d 文件夹中包含了线程 管理相关的代码,其中两个重要的方法g c j i l o c f a s t 和g c a l l o c 即存该文件夹中。 第2 章h a m o n y 平台及垃圾收集器g c v 5 的研究 分配成功,所以m o s 和n o s 的虚地址可能相邻也可能不相邻,如图2 4 。这样 整个堆在物理地址上分为两部分,一部分为n o s ,另一部分为l o s 和m o s 。 g c v 5 为m o s 和n o s 申请的虚地址空间大小是相i 卅的,都是h e a ps i z e i o ss i z e ( h e a ps i z e 为虚拟机总的堆大小) 。但征程序运行过程中,实际分配给m o s 和 n o s 的物理地址并不是每_ 二个都是h e a ps i z e 。i o ss i z e 。由是它两的和是 h e a ps i z e 1 0 ss i z e 。这样m o s 和n o s 的动态调节就转变为实际分配给m o s 和 n o s 的物理地址大小的调节。 其它关于三个空间的使用和m o s 和n o s 边界不固定的情况是相同的。 佗s e r v c d - b 私e + k 喀s i z e r l o sm o s j l l n o s n o s ,( u n d a r y 图2 4m o s 和n o s 边界崮定时g c v 5 堆空问的布局图 2 3g c v 5 中堆空间的管理 g c g e n 将堆划分为n o s 、m o s 、l o s ,在n o s 中为普通对象分配空间, 在l o s 中为大对象分配空间,m o s 不直接用于为应用程序中的对象分配窄问, 其用于存放n o s 中存活的对象。g c g e n 对整个堆的收集主要有两类,一类是 m i n o r 收集,该收集只对部分堆空间进行收集;另外一类是m a i o r 收集,该收集 对整个堆进行收集。当前g c v 5 中的收集策略是,m i n o r 收集时对n o s 和l o s 收集,分别采用他们对应的算法。m 旬o r 收集时分为两种情况,一种是采用 m o v ec o m p a c t 算法,如果使用该算法时,只对m o s 和n o s 空间进行收集,而 不对l o s 空间做处理。一种是s 1 d ec o m p a c t 算法,使用该算法时,对l o s 、 m o s 、n o s 三个了空间全部进行收集。 g c m s 在一个空间中统一管理大对象和普通对象,采用标记清扫算法管珲 整个堆,整个堆窄问统一管理,不做进一步地划分。所有守闲窄问采用窄闲区 域池结构管理。空闲区域池管理所有大对象的分配,它包含1 2 8 条链表,依次 第2 章h a 珊o n y 平台及垃圾收集器g c v 5 的研究 管理大小为l k b 、2 k b 、1 2 7 k b 以及大小大于等于1 2 8 k b 的空闲空间,每 条链上的空闲空间大小相同。对于小于l k b 的对象的分配,首先从空闲区域池 中分配3 2 k b 大小的空闲空间到每个m u t a t o r 本地作为本地块,然后在该块内为 对象分配空间。大于l k b 的对象,直接在窄闲区域池中分配,将需要分配的对 象大小按1 k b 对齐,然后到对应大小的链表上查找是否有空闲空间,没有则到 更大s i z e 的链表上分配。当堆中无可用空f 甘j 时,使用标记清扫算法对整个堆空 间进行收集。 2 4g c v 5 中的并行分析 g c v 5 是一个并行( p a r a l l e i ) 的垃圾收集器,g c v 5 中的j i :行土要体现在两 个方面:内存分配的并行和垃圾收集的并行。 2 4 1m u t a t o r 和c o l l e c t o r 的概念 在g c v 5 中涉及到了两个线程实体m u t a t o r 和c o l l e c t o r 的概念,它们分别代 表j a v a 应用程序中的线程实体和垃圾收集器中的线程实体。因为m u t a t o r 在n o s 上分配内存和c o i l e c t o r 在m o s 上分配内存的行为相似,所以口j 以抽象出一个专 门用于分配内存的结构a l l o c a t o r 。不同点只在于m u t a t o r 为j a v a 心用程序中对 象分配空间,而c o l i e c t o r 负责垃圾收集过程中为存活的埘象分配空间。g c v 5 中 的做法是为m u t a t o r 和c o i l e c t o r 抽象出一个基类a l l o c a t o r ,在分配的时候只使用 a l l o c t o r 的接口,并不依赖于足m u t a t o r 还足c o l l e c t o r 。这样做的好处足可以容 易的在a i i o c a t o r 、m u t a t o r 、c o i i e c t o r 之间做转换。 结合前面提到的p a r a i l e l 、c o n c u r r e n t 及j i :行的j a v a 应用程序,说明一下 m u t a t o r 、c o l l e c t o r 和它们之间的关系。p a r a l i e l 的意思足g cc o l l e c t o r 之间的并 行! c o n c u n e n t 是指m u t a t o r 和c o l l e c t o r 之间同时执行,并行的j a v a 应用程序是 指应用程序中有多个线程同时运行。故m u t a t o f 跟g c 算法是否p a r a l l e l 和 c o n c u r r e n t 没有关系,它和j a v aj 渺用程序中的线程相关,一个j a v a 应用程序中 的线程对应一个m u t a t o r ;而c o l i e c t o r 是在g c 内部创建的,是和处理器的数目 相关的( 默认情况下c o l i e c t o r 的数日是处珲器的个数,也可以通过命令行参数指 定) ,它和应用程序没有任何关系。 1 6 第2 章h a r r n o n y 平台及垃圾收集器g c v 5 的研究2 4 2 内存分配的并行 在m o s 和n o s 的内存分配中,每个a l l o c a t o r 都包含一个线程本地块, allocator首先在自己的本地block上为对象分配内存空间,如图25所示,内存分配并行进行,互不干扰,不需要任何同步操作。只有当a l i o c a t o 煎萋墅雾i雪重茎i萋西浯瓣墓蓁霾薹!i美寒菱i霎!甜菇墼斋墨霪凑蠹蘼薹!蟹喜耋j 雾囊囊 誓雾 蠹荔 薹! 孝事要 | _ ! 凳茎| l i 墓:蔓至圣 薹婴篓萝荔蓦翥“ 萋篝_囊i一鬟i 雾蓁 萎 兰三_ 妻鎏斋鬟嚣蠢甾i 羹萋篾嚣型耋雾羹蓁翼羹薹薹l 薹一錾墓囊茎雾一 羹耋嚣融釜。塞蓐囊茎雾薹型;垂垂睦霎塑蓁萎囊矍蕊登ca l l o cf a s c和g ca i i o cf a s t 。当止在 执行的j a v a 应用程序创建一个新对象时,通常j i t 先是调用g ca l l o cf a s t 进行快 速的分配,大多数情况下该分配都足成功的。只有在g ca l lo cf a s t 操作不成功, 返回n u l l 时,j i t 才调用g ca j l o c 方法来分配空间。因为g ca i l o cf a s t 是线程 本地分配,不处理大对象,吏重要的是4 i 会发生垃圾收集(g c ) ,所以开销很小。 而g ca l l o c 会发生g c ,调用它之前需要做很多为了执行g c 而需要的预备t 作, 所以开销比g ca l l o cf a s t 人很多。 另外g c v 5 中对外还提供了一个方法g c - f o r c 喵c ,用于在应用程序中强制 的执行垃圾收集。需要注意的是它做的是m i n o r 收集,只将n o s 中的活对象拷 贝到m o s 中,并不是对整个堆做收集。而g c 内部使用的垃圾收集方法 g cr e cj a i m e d x 第2 章h a m o n y 平台及垃圾收集器g c v 5 的研究 一个被赋予了级别的日志,从该口志继承级别。但如果口志对象自身已经被设 置了级别,则不需要继承。r o o t l o g g e r 的默认级别是w a r n 级别。 执行到日志信息的输出语句时,首先比较日志对象的消息级别( p 坩) 和日志 对象本身的级别来决定是否处理该口志,只有当口志对象的消息级别高于或等 于日志对象的自身级别时,该日志消息才会被输出。 2 6 2g c v 5 中日志输出系统的设计 根据g c v 5 中分代算法自身的特性,以及对用户和开发人员有用性,我们将 日志信息分为四个类别,g c b a s e ,g c c o l l e c t ,g c s p a c e ,g c p r o c e s s 。其中g c b a s e 和g c p r o c e s s 只有i n f o 级别的口志信息,而g c c o l i e c t 和g c s p a c e 分别包含i n f o 和t r a c e 两个级别的日忐信息。表2 1 给出了各个日忐对象刘。应的相犬信息。 g c b a s e 只有i n f o 级别的日志信息,通过g c b a s e 输出的信息,用广可以知道 运行应用程序的垃圾收集器的基本信息。可以用来了解g c 中的一些默认参数和 检查用户指定的命令行参数是否正确。另外g c b a s e 还输出应用程序的执行时间, 垃圾收集占用的时间,发生的次数等垃圾收集运行的总体信息,这螳信息可以 给用户一个关于垃圾收集器运行的粗略的概况。 g c c o l l e c t 主要输出应用程序执行期间收集相关的信息,其包含i n f o 和 t r a c e 两个级别的日志信息。i n f o 级别的信息输出垃圾收集发生的原因,种 类,时间等信息,可以用以了解各种垃圾收集算法发生的频率及原因等。t r a c e 级别的信,自、输出每一次垃圾收集的详细信息,利用这些信息,用户和丌发者口j 以详细地知道各个收集线程的行为及它们的负载情况,可以帮助开发人员进一 步地调整收集算法。 g c s p a c e 输出应用程序执行期间各子空间相关的信息,其包含i n f o 和 t r a c e 两个级别的信息。i n f o 级别的信息输出各窄问的大小,动态凋整等相 关信息。t r a c e 级别的信息输出各了空间分配相关的信息,及每次收集各了空 间中死活对象的情况。通过该类别的信息可以详细了解各子空间对垃圾收集行 为的影响,进一步地改进收集算法及窄间大小的设讣。 g c p r o c e s s 只包含i n f o 级别的信息,该类信息用以展示垃圾收集过程的各 个阶段及当前所处的状态,起到一个交互的作用。 表2 1g c v 5 中同志分类及信息级别分类 1 日志对象i 消息级别l 相关信息 2 0 第2 章h a m o n y 平台及垃圾收集器g c v 5 的研究 g c b a s en f o垃圾收集模块的基本信息。如垃圾收集的创建,初始 化、结束信息等。 g c c o l l e c t m f o 收集的序号,收集发生的原冈,收集的种类( m i n o r , m a j o r ) ,收集花费的时问,距上一次发牛收集的时间 等。 t r a c e 收集过程中每一个c o l l e c t o r 处理f l f 勺榴关信息,如标记 的对象数目,移动的对象数目及大小,各个c o l l e c t o r 的负载量等。 g c s p a c e i n f 0 垃圾收集过程巾各空l 刊的大小信息、空间的调整,堆 扩展信息等。 t r a c e 各空间的收集算法,分配的对象数日,存货的对象数 目,存活率等。 g c p r o c e s s i n f 0 用于指示前垃圾收集处丁二的阶段。 2 6 3g c v 5 中日志输出系统的实现 为了输出上述各个口志的信息,且维护原有代码的模块性及可读性,对应 到垃圾收集中需要关注的信息,我们定义了两个新的数据结构g cg e ns t a t s 和 g cg e nc o l l e c t o rs t a t s 来收集垃圾过程中的相关信息,其中g cg e ns a t a s 用 于统计垃圾收集总体上的信息,g cg e nc o l l e c t o r ss t a t s 用于统计收集过程中各 个收集线程的信息。 日志系统为垃圾收集过程中的每一个c o l l e c t o r 创建一个 g cg e nc o l i e c t o rs t a t s ,在执行过程中将相关信息记录在 g cg e nc o l i e c t o rs t a t s 当中。在每次垃圾收集结束后,综合各个c o l i e c t o r 统 计的数据信息就可以得到这一次整个垃收集过程的相关信息,并更新到 g cg e ns t a t s 。图2 8 和图2 9 给出了g cg e ns t a t s 和g cg e nc o l l e c t o rs t a t s 的数据结构。 另外,根据用户关注的信息类别,在垃圾收集算法的相应位置输出相应的 信息。另外在g c c o m m o n h 中添加了一个宏“g c g e n s t a t s ”削十控制是否 打开日志系统,只有该宏打丌时,垃圾过程中才会收集相关的信息。日志输出 系统的各类日志信息的输出方法见下一小节。 t y p e d e fs t n j c tg c g e n s t a t s u n s i g n e di n tn u r n r n i n o r - c o i i e c t i o n s ;肺i n o r 收集发生的次数 u n s i g n e d m tn u m m a j o l c o l l e c t i o n s ;m a j o r 收集发生的次数 u n s i g n e di n tn u m l 第一萋霎l m i p 治西洲魁则副职g j r 5 囊赫莽 塞錾;翥乎e 性 囊;鋈 薹鬟羹翼薹霪羹篓薹曩、熏鎏冀露型鍪囊窘;墓誊 萎i 羹鬈攫懑也j 薹主;囊霉;i 宴室l 垤謇髦 雾霪雾耄薹| 墨;羹鍪雯蓍誊萋孽i 薮x 篓坚墨i 蠢i 耄;l i 鍪l i 羹l ! i 蓁篓薹献塞堑囊,前羹霞雾霪移弛鲤毽羹 孙i 薹差鏊奏型 羹蓁篓零蔫鋈7 攀舂荔;i 毫羹| 薹l 鎏篓f f f 茎记的霪案;裂型 x 第3 章g c v 5 中大对象管理算法的研究 第3 章g c v 5 中大对象管理的研究 针对目前垃圾收集算法中人对象管理的缺陷,我们提出了一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论