《Java程序里的内存泄漏是如何表现的.docxVIP

《Java程序里的内存泄漏是如何表现的.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《Java程序里的内存泄漏是如何表现的

Java程序里的内存泄漏是如何表现的 大多数程序员都知道使用类似于 Java 的编程语言的好处之一就是他们无需再为内存的分配和释放所担心了。你只需要简单地创建对象,当它们不再为程序所需要时 Java 会自行通过一个被称为垃圾收集的机制将其移除。这个过程意味着 Java 已经解决了困扰其他编程语言的一个棘手的问题 -- 可怕的内存泄漏。果真是这样的吗? 在进行深入讨论之前,让我们先回顾一下垃圾收集是如何进行实际工作的。垃圾收集器的工作就是找到程序不再需要的对象并在当它们不再被访问或引用时将它们移除掉。垃圾收集器从贯穿整个程序生命周期的类这个根节点开始,扫描所有引用到的节点。在遍历节点时,它跟踪那些被活跃引用着的对象。那些不再被引用的对象就满足了垃圾回收的条件。当这些对象被移除时被它们占用的内存资源会交还给 Java 虚拟机(JVM)。 因此 Java 代码的确不需要程序员负责内存管理的清理工作,它自行对不再使用的对象进行垃圾收集。然而,需要记住的是,垃圾收集的关键在于一个对象在不再被引用时才被统计为不再使用。下图对这一概念进行了说明。 上图表示在一个 Java 程序执行时具有不同的生命周期的两个类。类 A 首先被实例化,它存在的时间比较长,几乎贯穿整个进程的生命周期。在某个时间点,类 B 被创建,类 A 添加了一个对这个新建类的引用。我们假设类 B 是某个用于显示并返回用户指令的用户界面部件。尽管类 B 不再被使用,如果类 A 对类 B 的引用未被清除,类 B 将继续存在并占据内存空间,即使下一次垃圾收集被执行。 什么时候需要注意内存泄漏? 如果在你的程序执行一段时间之后遇到 java.lang.OutOfMemoryError 的话,内存泄漏无疑是最值得怀疑的。除了这种明显的情况之外,什么时候需要考虑内存泄漏?完美主义的程序员会回答说所有的内存泄漏都需要进行审查和更改。然而,在跳到这一结论之前还需要考虑其他几点因素,包括程序的生命周期以及内存泄漏的大小。 考虑一下在一个程序的生命周期里垃圾收集器可能从未执行的情况。无法保证什么时候 JVM 会调用垃圾收集 -- 即使程序显式调用 System.gc()。通常情况下,垃圾收集器不会自动运行,直到程序需要比目前可用内存还要多的内存。此时,JVM 会首先尝试调用垃圾收集器以获取更多可用内存。如果这个尝试仍旧不能够释放出足够的资源,JVM 将会从操作系统获取更多内存,直到达到所允许内存的最大值。 举个例子来说,一个小型的 Java 应用程序,用来显示一些简单的配置修改的用户界面元素,出现了内存泄漏。垃圾收集器可能在程序关闭之前都不会被调用到,因为 JVM 可能总是有足够的内存来创建程序所需要的所有对象。因此,在这种情况下,即便是一些已死对象在程序运行的时候仍旧占据着内存,但这并不影响实际应用。 如果开发中的 Java 代码将以每天 24 小时运行在服务器上,这时内存泄漏将会比上面的那个配置工具程序要明显的多了。即便是代码中最小的内存泄漏,在持续运行的情况下最终也将耗尽所有可用内存。 相反的情况下,即使一个程序只是短暂存活,却分配了大量临时对象(或者少量的占用大量内存的对象),在这些对象不再需要时没有取消引用,这样的 Java 代码也会达到内存限制。 最后一个值得注意的问题是,不必过于担心(Java 程序所造成的)内存泄漏。Java 内存泄漏不应该被认为是像其他语言中所发生的那样危险,比如 C++ 的内存丢失将永远不会返回给操作系统。Java 应用程序中,我们把不再需要的却占据着内存资源的对象都交给 JVM.所以在理论上来说,一旦 Java 程序和它的 JVM 关闭掉,所有分配的内存都将归还给操作系统。 如何断定程序具有内存泄漏 查看一个运行在 Windows NT 平台上的 Java 程序是否具有内存泄漏,你可以简单地在程序运行的时候去观察任务管理器中的内存设置。然而,在观察一些运行中的 Java 程序之后,你会发现,它们跟本地应用程序相比使用更多内存。我开发过的一些 Java 项目会启用 10 到 20 MB 的系统内存。与这个数字相比,本地的操作系统自带的 Windows Explorer 程序使用到 5 MB. 另外一个关于 Java 程序的内存使用要注意的是典型的运行在 IBM JDK1.1.8 JVM 上的程序似乎在其运行时不断吞噬了越来越多的系统内存。程序似乎永远不会返回一些内存给操作系统,直到一个非常大的物理内存分配给它。这会不会就是内存泄漏的迹象? 要明白是怎么回事,我们需要熟悉 JVM 是如何将系统内存使用作自己的堆的。在运行 java.exe 时,你可以使用一些特定的选项来控制垃圾收集的堆的启动容量和最大容量(分别是 -ms 和 -mx)。Sun 的 JDK 1.1

文档评论(0)

yingrong + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档