算法(4th ed)(105):基础——数据抽象 4.5.9

阅读数:14 2019 年 11 月 2 日 12:21

算法(4th ed)(105):基础——数据抽象 4.5.9

(数据类型的设计:内存管理)

我们可以为一个引用变量赋予一个新的值,因此一段程序可能会产生一个无法被引用的对象。例如,请看图 1.2.9 中所示的三行赋值语句。在第三行赋值语句之后,不仅 ab 会指向同一个 Date 对象(1/1/2011),而且不存在能够引用初始化变量 a 的那个 Date 对象的引用了。本来该对象的唯一引用就是变量 a,但是该引用被赋值语句覆盖了,这样的对象被称为孤儿。对象在离开作用域之后也会变成孤儿。Java 程序经常会创建大量对象(以及许多保存原始数据类型值的变量),但在某个时刻程序只会需要它们之中的一小部分。因此,编程语言和系统需要某种机制来在必要时为数据类型的值分配内存,而在不需要时释放它们的内存(对于一个对象来说,有时是在它变成孤儿之后)。内存管理对于原始数据类型更容易,因为内存分配所需要的所有信息在编译阶段就能够获取。Java(以及大多数其他系统)会在声明变量时为它们预留内存空间,并会在它们离开作用域后释放这些空间。对象的内存管理更加复杂:系统会在创建一个对象时为它分配内存,但是程序在执行时的动态性决定了一个对象何时才会变为孤儿,系统并不能准确地知道应该何时释放一个对象的内存。在许多语言中(例如 C 和 C++),分配和释放内存是程序员的责任。众所周知,这种操作既繁琐又容易出错。Java 最重要的一个特性就是自动内存管理。它通过记录孤儿对象并将它们的内存释放到内存池中将程序员从管理内存的责任中解放出来。这种回收内存的方式叫做垃圾回收。Java 的一个特点就是它不允许修改引用的策略。这种策略使 Java 能够高效自动地回收垃圾。程序员们至今仍在争论,为获得无需为内存管理操心的方便而付出的使用自动垃圾回收的代价是否值得。

复制代码
Date a = new Date(12, 31, 1999);
Date b = new Date(1, 1, 2011);
a = b;

算法(4th ed)(105):基础——数据抽象 4.5.9

图 1.2.9 孤儿对象

评论

发布