当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:14:00  来源:本站整理

Java理论与实践: 垃圾堆积简史[Java编程]

赞助商链接



  本文“Java理论与实践: 垃圾堆积简史[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

Java 语言大概是利用最遍及的依靠于垃圾汇集的编程语言,但是它并非第 一个.垃圾汇集已经成为了包含 Lisp、Smalltalk、Eiffel、Haskell、ML、 Scheme和 Modula-3 在内的很多编程语言的一个集成部份,并且从 20 世纪 60 年代早期就开始利用了.在 Java 理论与实践的本篇文章中,Brian Goetz 描写 了垃圾汇集最常用的技术.

垃圾汇集的好处是无可辩论的 ―― 坚固性提高、使内存管理与类接口计划 别离,并使开辟者削减了跟踪内存管理错误的时间.闻名的悬空指针和内存泄露 问题在 Java 程序中再也不会发生了(Java 程序大概会呈现某种情势的内存泄 漏,更切确地说是非成心的对象保存,但是这是一个差别的问题).不过,垃圾 汇集不是没有代价的 ―― 此中包含对性能的影响、暂停、配置复杂性和不肯定 的完毕 (nondeterministic finalization).

一个抱负的垃圾汇集实现应当是完好不可见的 ―― 没有垃圾汇集暂停、没 有因为垃圾汇集而产生的 CPU 时间丧失、垃圾汇集器不会与虚拟内存大概缓存 有负面的互动,并且堆不需求大于利用程序的 驻留空间(即堆占用).当然, 没有十全十美的垃圾汇集器,但是垃圾汇集器在过去十年中已经有了很大改良.

选项与挑选

1.3 JDK 包含三种差别的垃圾汇集战略,1.4.1 JDK 包含六种垃圾汇集战略 以及 12 种以上用于配置和优化垃圾汇集的号令行选项.它们有什么差别?为什 么需求有这么多选项?

差别的垃圾汇集实现利用差别的战略来辨认和收回不可到达的对象,它们与 用户程序和调度器以差别的方法互动.差别范例的利用程序关于垃圾汇集有差别 的要求 ―― 及时利用程序会将要求汇集暂停的持续时间短并且有限制,而企业 利用程序大概答应更长时间和可猜测性更低的暂停以得到更高的吞吐本领.

垃圾汇集若何工作?

有几种垃圾汇集的基本战略:引用计数、标志-排除、标志-整理 (mark- compact) 和复制.此外,一些算法可以以 增量 方法完成它们的工作(不需求 一次汇集整个堆,使得汇集暂停时间更短),一些算法可以在用户程序运行时运 行( 并发汇集).其他算法例必须在用户程序暂停时一次举行整个汇集(即所 谓的 stop-the-world汇集器).最后,还有混合型的汇集器,如 1.2 和今后版 本的 JDK 利用的分代汇集器,它对堆的差别区域利用差别的汇集算法.

在对垃圾汇集算法举行评价时,我们大概要考虑以下全部尺度:

暂停时间.汇集器能否终止全部工作来举行垃圾汇集?要终止多长时间?暂 停能否有时间限制?

暂停的可猜测性.垃圾汇集暂停能否筹划为在用户程序便利而不是垃圾汇集 器便利的时间发生?

CPU 占用.总的可用 CPU 时间用在垃圾汇集上的百分比是多少?

内存大小.很多垃圾汇集算法需求将堆分割成独立的内存空间,此中一些空 间在某些时刻对用户程序是不可拜候的.这意味着堆的实际大小大概比用户程序 的最大堆驻留空间要大几倍.

虚拟内存交互.在具有有限物理内存的系统上,一个完好的垃圾汇集在垃圾 汇集历程中大概会错误地将非常驻页面放到内存中来举行查抄.因为页面错误的 本钱很高,所以垃圾汇集器精确管理引用的区域性 (locality) 是很必要的.

缓存交互.即便在整个堆可以放到主内存中的系统上 ―― 实际上几近全部 Java 利用程序都可以做到这一点,垃圾汇集也常常会有将用户程序利用的数据 冲出缓存的效果,从而影响用户程序的性能.

对程序区域性的影响.固然一些人认为垃圾汇集器的工作只是收回不可到达 的内存,但是其他人认为垃圾汇集器还应当尽大概改良用户程序的引用区域性.整 理汇集器和复制汇集器在汇集历程中重新安置对象,这有大概改良区域性.

编译器和运行时影响.一些垃圾汇集算法要求编译器大概运行时环境的重要 配合,如当举行指针分配时更新引用计数.这增添了编译器的工作,因为它必须 生成这些簿记指令,同时增添了运行时环境的开销,因为它必须履行这些额外的 指令.这些要求对性能有什么影响呢?它能否会干扰编译时优化呢?

不管挑选什么算法,硬件和软件的发展使垃圾汇集更具有实用性.20 世纪 70 和 80 年代的经验研究表明,关于大型 Lisp 程序,垃圾汇集损耗 25% 到 40% 的运行时.垃圾汇集还不能做到完好不可见,这必定还有很长的路要走.

基本算法

全部垃圾汇集算法所面对的问题是相同的 ―― 找出由分配器分配的,但是 用户程序不可到达的内存块.不可到达是什么意思?可以以两种方法之一拜候内 存块 ―― 大概用户程序在 根 (root)中有对这一内存块的引用,大概在另一个 可到达的块中有对这个块的引用.在 Java 程序中,根是对静态变量中大概活泼 的仓库框架上的本地变量中所包含的对象的引用.可到达的对象集是指向关系下 根集的传送闭包.


  以上是“Java理论与实践: 垃圾堆积简史[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .