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