- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈Java 虚拟机垃圾收集算法的研究和改进
1 垃圾收集基本算法研究和当前的瓶颈
垃圾收集器的核心是识别和回收不可到达的对象,不同的垃圾收集实现使用不同的策略来完成,它们与用户程序和调度器以不同的方式互动。有几种垃圾收集的基本策略: 引用计数、标记-清除、标记-整理和复制。此外,还可以按照系统运行方式来分类算法,串行收集必须在用户程序暂停时进行整个收集,并行或并发收集是使用多线程进行收集来提高效率。
1. 1 垃圾回收基本算法研究
引用计数是最基本的垃圾收集策略,早期的JVM 采用此算法,但是缺点也很明显,如它不能回收不可到达的循环结构以及需要监控每一次的内存操作; 标志-清除算法主要包括扫描标志所有被应用对象,然后清除未引用对象两个步骤,最大的不足是执行时需要暂停整个程序,以及容易在堆中产生碎片; 复制算法创新地提出把堆一分为二,其中一个区域包含当前使用的活跃的数据,另一个区域未使用,垃圾回收时,遍历当前已经使用的有相关活跃对象的区域,把正在使用中的对象从当前区域复制到另外一个区域中,性能好,而且不会有碎片,主要问题就是必须要两倍的内存空间; 标记-整理算法则是结合了标记-清除和复制这两个算法的优点,避免了需要两倍内存空间的问题,但增加了不少复杂性,该算法也是分两阶段,第一阶段从对象根节点开始标记所有被引用对象,第二阶段遍历整个堆,清除未标记对象并且把存活对象“压缩”到堆的其中一块,按内存顺序排放; 分代收集利用统计学分析的方法来提高效率,分析表明大多数内存块( 90%) 的生存周期都比较短,垃圾收集器应当把更多的精力放在检查和清理新分配的内存块上,它是基于对象的生存周期统计分析后得出的算法,把对象分为年青代( 年轻的新生对象) 、年老代( 经过几次回收仍然存活的对象) 、持久代( 静态文件、JAVA 类、方法等) ,对不同生命周期的对象使用不同的算法( 如标记整理) 进行回收。
1. 2 垃圾回收的瓶颈
经过不断的算法创新和改进,垃圾回收方式已经在内存空间效率和CPU 时间效率两个方面有了非常大的提升。但仍然无法解决完全GC 带来的暂停问题。在一些对实时性要求很高的应用情形下( 如期望返回时间在几百毫秒以内),如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个较小范围内,但是这样又和应用本身的处理能力产生很大的矛盾,同样也是不能接受的。即垃圾收集的周期,以及每次收集的时间还是不确定。
2 新改进的算法
新改进的算法主要目标是在不牺牲堆空间利用效率和CPU 性能的前提下达到准实时( 可以设定和控制GC 最大暂停时间) ,如0. 5 秒。这个特性对于准实时响应的系统( 如电信系统) 而言非常重要,因为这样就再也不用担心系统会突然暂停两秒这种情况的发生了。
为了能够达到期望的目标,新的算法在原有的各种算法上进行了吸收和改进,第一方面: 新算法吸收了增量GC,将整个虚拟机堆划分为多个固定大小的区域[5],这样通过先在空间维度上的划分,然后在小粒度上处理收集的方法,为实现整个实时性目标打下一个基础。第二方面,采用了并发的快照扫描算法,进行全局范围的未到达对象周期性完整扫描。同时扫描时统计了每个小区域中的活跃对象。这个信息帮助后续选择哪一个区域进行回收。第三方面,采用新的选择回收机制估算区域级垃圾回收时间,然后根据限值选择相应的区域。
2. 1 新算法堆分区和区域结构
新算法将堆划分为多个固定大小的区域,每个区域都是在内存中一块连续的区域。当一块区域放满后,会申请新的一块区域来存放,空的区域用链表结构组织起来。区域之间的对象引用通过“关系集合”来维护,对于巨大的对象,如超过一个区域的一半以上,用专用的一个堆来处理这类对象。每个区域都有一个关系集合,关系集合中包含了从其他区域中引用当前区域中相关对象的引用地址,随着程序的操作,新引用或解除当前区域中的一个对象都会在关系集合中做出相应的修改。这个关系集合主要维护跨区域的对象引用联系。区域1,3中都引用了区域2 的对象b,所以区域2 关系集合中维护了相应的关系。这些区域中对象的引用关系不断地发生改变,新算法采用了卡片表来通知区域修改“关系集合”,每个应用的线程都有一个关联的关系集合记录,用于缓存和顺序化线程运行时造成的对于卡片的修改。另外,还有一个全局的缓存区,当应用线程执行时修改了卡片后,如果造成的改变仅为同一区域中的对象之间的关联,则不记录关系集合历史; 如造成的改变为跨区域中的对象的关联,则记录到线程的关系集合历史; 如线程的关系集合历史满了,则放入全局的缓存区中,线程自身则重新创建一个新的关系集合历史,关系集合本身也是一个由一堆卡片构成的哈希表。
下面是具体垃圾回收执
- 软件下载与安装、电脑疑难问题解决、office软件处理 + 关注
-
实名认证服务提供商
专注于电脑软件的下载与安装,各种疑难问题的解决,office办公软件的咨询,文档格式转换,音视频下载等等,欢迎各位咨询!
文档评论(0)