JVM系列之内存泄漏

摘要:在Java中,内存泄漏是指程序中存在某些对象已经不会再被使用,但由于仍被其它对象引用而造成内存不能被及时释放,从而造成内存被浪费。
什么是内存泄漏?在Java中,内存泄漏是指程序中存在某些对象已经不会再被使用,但由于仍被其它对象引用而造成内存不能被及时释放,从而造成内存被浪费。

我们知道Java创建一个对象后,就会在堆内存中给这个对象分配一块内存,JVM会监控所有的对象创建、赋值等过程,JVM持有一个记录对象引用的一个有向图,起点为Root,把一个对象赋值给某个引用,JVM就会给这个对象在引用有向图中加多上一条路径。当一个对象不再被引用,即通过Root到这个对象不可达,在下一次GC到来时就可能回收这个对象。
举个例子,如下所示:
public static void main(String[] args){
     Object obj1 = new Object();
     Object obj2 = new Object();
     obj2 = obj1;

     ...
}


调用obj2=obj1,使obj2引用指向对象OBJ1,OBJ2对象由于没有引用指向,那么如果下一次GC到来,那么就可能会回收OBJ2对象(因为垃圾回收的过程是不确定的,当一个对象没有被引用了,那么说明这个对象可以被回收,但不能保证一定会被回收掉)。

如果在程序中确定不再使用OBJ2对象,但却被其它对象引用,那么就会出现内存泄漏的现象,如下所示:
Object obj1 = new Object();
Object obj2 = new Object();
Vector v=new Vector(10);
v.add(obj1);
v.add(obj2);
...
obj2 = null;

代码中obj2 = null确定会释放obj2对OBJ2对象的引用,但是变量v仍然保持着对OBJ2对象的引用,那么OBJ2对象不会被GC回收。

我们在写程序时应该正确地释放不再引用的对象,尤其是在一些静态集合、数据库连接、内部类的代码中,应当检查是否存在不可用对象的引用仍然被持有,避免因为无法释放不可用对象而造成内存的浪费。

版权说明:如无特殊说明,文章均为本站原创,如需转载请注明出处

本文标题:JVM系列之内存泄漏

本文地址:http://www.wolfbe.com/detail/201609/378.html

本文标签: 内存泄漏 JVM java

相关文章

感谢您的支持,朗度云将继续前行

扫码打赏,金额随意

温馨提醒:打赏一旦完成,金额无法退还,请谨慎操作!

扫二维码 我要反馈 回到顶部