全面解析 Java 的垃圾回收机制
Java 的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java 虚拟机(JVM)的堆中储存着正
在运行的应用程序所建立的所有对象,这些对象通过 new、newarray、anewarray 和
multianewarray 等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收来
负责的,尽管 JVM 规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有
限性,JVM 在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地
释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。
垃圾收集的意义
在 C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;
而在 Java 中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM 的一个系统
级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当
一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放
没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空
间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆
的一端,JVM 将整理出的内存分配给新的对象。
垃圾收集能自动释放内存空间,减轻编程的负担。这使 Java 虚拟机具有一些优点。首先,它能使编
程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用 Java
语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性, 垃圾收集是 Java 语言
安全性策略的一个重要部份。
垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java 虚拟机必须追踪运行程序中有用的对象,
而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采
用的某些垃圾收集算法就不能保证 100%收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及
软硬件运行效率的不断提升,这些问题都可以迎刃而解。
垃圾收集的算法分析
Java 语言规范没有明确地说明 JVM 使用哪种垃圾回收算法,但是任何一种垃圾收集算法一般要做 2
件基本的事情:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,使该空间可被程序再
次使用。