【Java-GC】集合Collection的clear()和GC垃圾回收测验

时间:2024-03-16 08:07:29

转自CSDN博客。修复引用网易图片引起的图片丢失。

个人理解:

虽然不做任何操作,GC会自动回收 ArrayList 内部的对象和 ArrayList 自己本身占用的空间,但GC的时间无法确定,可能在程序运行结束后(对于要一直运行的服务肯定无法接受),也可能由JVM按照某种调度算法定时回收。
但个人认为,程序员主动的使用 list = null,map = null 等赋予 null 值 的方法标记自己不再使用的对象,更有利于GC回收。毕竟再智能的GC算法,也比不上创造这些Java对象的程序员。

 

原文如下:

一、一个简单的例子

【Java-GC】集合Collection的clear()和GC垃圾回收测验
代码图

代码运行结果图:

【Java-GC】集合Collection的clear()和GC垃圾回收测验
运行结果图1

运行结果图1为上代码图的运行结果,说明在创建了一个大小为100W的列表后,内存分配了一定大小的空间,在clear() 之后,调用gc()垃圾清除后得到创建列表以后的内存大小。

如果将代码中第11行改为

ArrayList<String> list= new ArrayList<String>();

后将得到运行结果图2.说明在创建了一个默认大小的列表后,往里面添加数据时自动扩充了列表的大小,因为列表扩充时成倍扩充的原理,最后调用clear()和gc()后的结果内存要比图1中少(可能此时列表的SIZE要大于100W).

【Java-GC】集合Collection的clear()和GC垃圾回收测验
运行结果图2


如果将代码中第32行中的list.clear();改为list=null; 将会得到以下结果:

【Java-GC】集合Collection的clear()和GC垃圾回收测验
运行结果图3

或将第32行删掉后也会得到上述结果.

说明赋值NULL后不仅列表中的对象变成了垃圾,为列表分配的空间也会回收,什么都不做与赋值NULL一样,说明直到程序结束也用不上列表list了,它自然就成为垃圾了.clear()只是清除了对象的引用,使那些对象成为垃圾。