
7-4 垃圾回收
在1-8节介绍了Java语言的一个特点是自动垃圾回收,多数文章或程序会用GC或gc当作垃圾回收的缩写,在Java的JVM环境中有一个线程GC threads,主要工作内容就是执行垃圾回收。它的基本思想就是将已经不再使用的内存空间回收,本节将简单地说明Java的垃圾回收。
7-4-1 参照计数
请再看一次下列数组的内存图示。

对上图右边的数组内存而言,目前有score数组变量参照它,这种情况称此内存的参照计数是1,请再看一次另一个内存参考图。

对上图右边的数组内存图形而言,目前有score和myscore数组变量参照它,这种情况称此内存的参照计数是2。
7-4-2 更改参照
Java在声明数组变量完成后,以后也可以重新为所声明的数组配置新的内存空间,这个行为称为更改参照。
程序实例ch7_18.java:先定义一个数组x,列出此数组内容。然后重新定义数组x,再输出一次内容。

执行结果

在Java系统中声明完数组x后内存图示如下。

对上述数组的内存内容而言,目前的参照计数是1。程序第9行是重新配置x数组变量,此时内存图示如下。

当重新配置x数组变量后,一个重大的影响是原先存放6、9、2内存内容的参照计数变为0,同时新增一块内存供存放新x数组变量使用。程序第10和11行,执行后内存内容如下。

所以程序第12和13行可以得到20、30的结果,从上述实例读者应该了解更改参照的意义。另一种常见更改参照的方式如下。

这时对于{6,9,2}数组内存而言,它的参照计数就少1了,而对于{10,20}数组内存而言,它的参照计数就加1。
7-4-3 参照计数减少的其他可能
在Java中除了更改参照可以减少参照计数,另外还有下列两种常见的减少参照计数的方式。
(1)将数组变量设为null,例如:

(2)参照数据类型的变量已经离开了变量的有效范围,8-7节中还会说明什么是变量的有效范围。
7-4-4 垃圾回收
从前面的说明已经可以了解当内存有被参照时,表示这是有用的内存,当然有用的内存是不可回收的,否则将导致程序错误。相反地,内存如果没有被参照,表示这是没有用的内存,这也是垃圾回收的主要对象。
不过,并不是内存没有被参照时就立刻回收,这可能会导致正在执行的程序有错误,Java还是会等待适当的时机执行回收工作,例如,在网络联机等待另一方响应时。
当然以上只是概述,读者可以使用Java Garbage Collection当作关键词查询更多垃圾回收的相关知识。