纯手打,请区分。很久很久以前,老师说过JAVA不存在内存泄露,因为JAVA与C/C++不同,有着强大垃圾回收机制,只要一个对象不存在访问通路,即该对象在内存中占用了空间,但是不会被访问到,那他就会被垃圾回收器收回,但是后来在往上看东西时候慢慢发现,其实JAVA一样存在内存泄露,只不过这个泄露的范围要比C/C++小,要解释这个还是要引用那个经典的例子(关于这个例子的其他相关解释你可以在网上搜索的到):- Vector v = new Vector();
- Object object = new Object();
- v.add(object);
- o = null;
复制代码 一步步分析这4行代码:
你创建了一个Vector,
然后你在栈中创建了一个引用object ,
又在堆中创建了一个实例new Object()
你将object引用放进了Vector中
然后又将object引用所占的内存释放掉了,o = null这句的本意其实是要释放o这个引用,从而让o连接着的object对象被垃圾回收器回收,但是因为你没清除Vector当中的引用信息,v依旧可以从自己的内部访问到object,所以object不满足垃圾回收机制,所以object的内存不会被释放,这就导致了内存泄露,不知道我说清楚没有。
内存泄露、内存溢出的情况有太多太多。。相信同类的实例网上一搜一大堆,很多都是实际开发中在应用其他开发技术的时候导致的。 |