在JAVA中由于有垃圾回收期,因此可以不用担心内存泄露的问题。但java还是会存在内存泄露,什么样的情况下java会发生内存泄露?
java中内存泄露的对象特点是:
1.对象可达
2.对象无用
这些对象因为可达,因此不会被垃圾回收机制回收,但又会一直占用内存,java中不可达的对象都会被系统回收。
java中内存泄露的情况:长生命周期对象持有短生命周期对象的引用,例如一个全局变量持有了局部对象的引用,或者成员对象持有了成员函数中局部对象的引用。例子:
public samlpe{
public:
Obj obj;
void test(){
ojb= new Obj();
}
}
在上面的例子中,obj持有了局部的对象空间,因此当函数test执行完之后,obj的空间还是不会释放,需要等到simple对象被回收时才会释放。
附:
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。