今天手撸项目的时候,惊然发现一个问题
全局变量: static Vector<ArrayList> vector=new Vector<>(0); 某函数下: vector.add(nearby_poi); System.out.println(vector.get(vector.size()-1).get(4)); Thread.sleep(10000); nearby_poi.clear(); 这样是可以完美输出的! 然而,当我改变了一下代码: vector.add(nearby_poi); nearby_poi.clear(); System.out.println(vector.get(vector.size()-1).get(4)); Thread.sleep(10000); 然后这段傻逼代码给爷报错。。。。。
在我的细细思索之下,认为,这俩逼和数组有些不同点,会不会是他们一个存储的地址,一个存储的是值捏,妈的,我一个逼大二学生凭什么知道哇,
所以哥们直接他妈的去ci si de ne上find find,一搜之下果然不出哥们所料,原来是他妈的这样:
在ArrayList中底层数组是Object类型,数组中存储的并不是数据本身,而是数据的引用,那么现在在看clear的方法
方法中将数组元素清空设置为null,即清除了对所有元素的引用,那么系统在gc的时候会将所有的元素清除,释放元素所占用的内存空间。但是此时并没有释放系统分配给elementData数组的空间。
拿到解决方案哥们欣喜若狂,直呼问题迎刃而解,如宝剑吹啥玩意断发,真实一泄如注,一心一意,一生一世,一二三四。
问题不大!
但是!问题来了,
问题是找到了,这该怎么去解决呢,哥们挠头,不用list也不行,现在是8:38,让哥们去想想解决办法。。。
只因你太美,哥们找到解决方法了,出在同一篇文章,现在是8:42,膜拜大佬!
方法中将数组元素清空设置为null,即清除了对所有元素的引用,那么系统在gc的时候会将所有的元素清除,释放元素所占用的内存空间。但是此时并没有释放系统分配给elementData数组的空间。
最后附上大佬文章:(21条消息) java集合ArrayList中clear方法内存释放分析_arraylist clear_天河~的博客-CSDN博客