定义

Java中的一个重要特性便是垃圾回收器,Java将程序员从无(dan)尽(teng)的内存管理中解放了出来,使用垃圾回收器自动收集程序中不再使用的对象,并释放其占用的内存空间。

本篇主要从以下方面对垃圾回收进行介绍

  • 垃圾收集的意义
  • 垃圾收集的规则

垃圾收集的意义

在C++中,一个对象如果不显式进行释放,那么其占用的内存在程序运行期间将不会被释放;而在Java中,当没有对象引用指向内存中的某个对象时,其内存空间便成为垃圾。JVM的垃圾回收器线程变会自动释放该内存块。

垃圾收集意味着程序员不再需要手动释放内存,不再需要的对象将会变成”无用对象”,这些对象将被自动清理和回收。当一个对象不再被引用的时候,将回收它占用的系统资源,如内存,句柄等等,以便这些资源继续分配给后来的新建的对象。

事实上,除了释放没用的对象,垃圾收集也可以清理内存碎片。由于不断的创建对象,垃圾收集器不断进行内存回收和释放,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆的一端,然后将整理出的内存分配给新的对象。

垃圾收集能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性, 垃圾收集是Java语言安全性策略的一个重要部份。

垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采用的某些垃圾收集算法就不能保证100%收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。

垃圾收集规则

虽然大部分JVM实现中都会有垃圾回收器,但事实上,JVM规范中并没有规定必须要有一个垃圾回收器。JVM规范在内存管理上给了虚拟机设计者很大设计自由度,甚至可以完全不使用垃圾回收器。

当然,即使实现了垃圾回收器,你也总有办法把内存耗尽。

虚拟机规范中并没有描述需要给JVM留多大的内存空间,只规定了当JVM内存不足时,应该抛出一个OutOfMemoryError。

此外,虚拟机规范中也并没有规定垃圾回收必须使用哪种算法,所以设计者们可以自由实现合适的垃圾回收算法。这也是众多JVM厂商竞争的领域。因为这对于程序而言十分重要。