简介

JavaTM 2 Platform, Standard Edition (J2SETM) 其中一个强大特性便是自动内存管理,从而对开发者屏蔽了复杂的显式内存管理。

这篇论文针对在J2SE 5.0版本发布的JAVA Hotspot虚拟机,对它做出了简要概述。本论文描述了垃圾收集器如何执行内存管理,并且在对垃圾收集器的选择和配置、可操作的内存区域的大小设置给出了建议。本文也提供了一些链接,其中一部分链接列举了可以影响垃圾收集器行为的选项,另一部分列举了更多详细的文档。

文章的第二节为那些对于自动内存管理还是新事物的用户而设立。它简明的讨论了与需要程序员显示的回收内存相比,自动内存管理的有何益处。文章第三节紧接着描述分代垃圾回收的概念,方案选择,性能指标。本节也介绍了一个叫作“分代”的通用内存区域划分的方法,它是基于对象生存时间的内存区域划分方法。对于大部分应用来说,这种基于代的划分有效地减少了垃圾回收时的暂停时间和整体性能开销。

本论文的剩余部分提供了Hotspot VM的 细节信息。第四部分描述了可用的四个垃圾回收器,包括在J2SE 5.0 update 6新出现的回收器,以及这些垃圾回收器都在使用的分代的内存划分方法。对任何一个收集器,第4部分对适合于他们各自的垃圾回收算法的类型和要求做出了概述。

第五部分描述了在J2SE 5.0中发布的可以在根据运行中的应用程序的平台和操作系统中来系统地自动选择垃圾收集器(1),堆内存大小,HotSpot虚拟机(客户端模式或者服务器模式),以及动态垃圾回收(2)以便自适应用户自定义的行为的技术,这项技术被称为人体工程学。

第六部分提供了选择和配置垃圾回收器的推荐规范。它也提供了关于OutOfMemoryErrors时该如何做的一些建议。第七部分简明的描述了评估垃圾收集性能时可以用到的一些工具。第八部分例举了有关垃圾收集器相关选项和行为的一些通用命令行。最终,第九部分提供了本论文所覆盖的观点的详细文档的链接。

显式VS自动内存管理

内存管理是一个识别不再使用的被分配的对象,重新分配(释放)被这些对象占用的内存,并且使这一系列的分配可用的过程。在一些程序语言中,内存管理是程序员的责任。这个复杂的任务造成了许多通用的能够造成异常和错误的程序执行行为以及崩溃。结果,大量的开发者把时间花费在调试和力图纠正这些错误上面。

一个在显式内存管理编程上面经常出现的问题就是悬空引用。他是一个对象使用空间已经被重新分配但是其他对象仍在引用。如果一个对象试图去引用这个对象最初的引用,但是这个对象已经被分配到新的对象,这个结果是未知的并且不是被期望的。

另外一个显式内存管理的公共问题是内存空间泄露。泄露造成的原因是对象不再被引用但是并没有被释放。举个例子,如果你打算释放一个链表占用的空间,但是你犯了一个只释放了这个链表头结点的错误,链表剩余的元素不再引用但他们在程序中不可达,并且不能被重新使用或者重新覆盖。如果足够的泄露发生,他们能不断的消耗内存直到所有内存被耗尽。

使用叫做垃圾回收器的程序来自动管理内存被认为是内存管理的一种通用替代方法,尤其是在现在大多数面向对象的语言中。自动内存管理增加了接口的抽象和代码的可靠性。

垃圾收集器避免了悬空引用的问题。因为仍然被引用的对象永远不会被垃圾会收取回收所以肯定不会被释放。垃圾收集器也解决了上面描述的内存空间泄漏的问题,因为它会自动释放所以不再引用的内存。

垃圾收集器的理念

垃圾收集器有如下职责:

1.分配内存

2.确保任何被引用的对象仍然在内存中间

3.重新覆盖那些在执行代码中引用不可达的内存。

仍然被引用的对象叫做存活的对象。不再引用的对象被认为是死亡的对象,术语上叫做垃圾。发现和释放(或者被称为再生)这些对象所占用对象的过程叫做垃圾回收。