消除过期的对象引用
2016-06-25 本文已影响383人
想飞的僵尸
第6条:消除过期的对象引用
1. 为什么要消除过期的对象引用
java虽然有自己的垃圾回收机制,但是并没有那么的智能,对于被引用的对象,就算我们已经不在使用它了,但是java的回收机制是不会回收他们的,人们称之为“内存泄漏”。
2. 无意识的对象引用
很多时候内存泄漏都是“人们无意识的内存引用”造成的,举个简单的例子:
List<String> list = new ArrayList<>();
String str = "testString";
list.add(str);
str = null;
上面的代码在创建str时的开辟的内存空间被回收了么?答案是否定的,list依然持有对str的引用,所以创建str时所开辟的内存空间是不会被回收的,这就是一个典型的“无意识的内存引用”。为了防止这些“无意识的内存引用”,我们应该了解对象相互引用的时候是存在怎样的依赖关系的。
3. 一个例子秒懂对象间相互依赖是怎样的
问题:
Object object1 = new Object();
Object object2 = object1;
Object object3 = object2;
请问object1, object2, object3和new出来的内存空间是怎样相互引用的呢?
-
选项A:
选项A.png -
选项B:
选项B.png
直接给答案,正确答案是B。
所以说下面这段代码,new 出来的那片内存空间是不会被回收的,因为object2和object3还在持有这片内存的引用。
Object object1 = new Object();
Object object2 = object1;
Object object3 = object2;
object1 = null;
4. 对于内存泄漏不要过分紧张
不要因为害怕内存泄漏而在所有的地方都手动回收内存,这样会导致我们的代码凌乱臃肿,不利于管理,我们应该把目标集中在那些长声明周期的变量中,哪些是长生命周期的变量呢,最明显的一个就是static修饰的变量,我们应该把目光放在这些变量上。
5. 解决之道
对于长生命周期的变量,我们可以进行手动回收,或者使用弱引用(WeakReference),java中的引用分好多种,想要学习可以bing或是google,这部分内容有点多,而我又已经差不多懂了,所以就不记录这么多了。
本篇文章到此结束。