黑马程序员技术交流社区

标题: java中的内存泄露问题 [打印本页]

作者: wq10zj    时间: 2014-2-17 11:37
标题: java中的内存泄露问题
请看下我的描述 啦(不是很会造句哒):
有内存泄露吗?
答:有,所谓内存泄露就是某个对象不用了,但没有被释放掉,这就是内存泄露

     但是java中不是有GC吗   首先产生的疑问是  这个对象被修改后
     其内存地址发生了变化,之前经过修改的对象的值会被释放,
     如果经过修改赋给的新值,因为hashCode的变化,导致要想对其操作时
     这个值因为内存地址的改变无法查找到,从而藏在了内存的某一块区域中
   
     但是你说他没有被释放   这是为什么呢?
     我知道他没有被用到,但是在java中难道没有被用到的对象  必须要经过使用后才能被释放
     吗?
     所以产生的疑问是:java中释放内存的条件是什么,是根据什么来释放内存的额?
作者: sinxy    时间: 2014-2-17 12:36
没用到的对象,或用过后的不需要对象,java虚拟机会自动调用垃圾回收器,释放空间。不过这时间上是不确定的。
作者: webform    时间: 2014-2-17 13:00
Java的内存管理其实就是对象的分配和释放问题。我们需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,而释放对象的根本原则就是该对象不再被引用。

内存泄漏:虽然,程序中对象是无用的,即程序以后不会再使用这些对象,但此对象存在通路可以与其它相连;
内存泄漏不是很好描述,举个例子更容易理解:
Vector v=new Vector(10);
for (int i=1;i<100; i++)
{
        Object obj=new Object();
        v.add(obj);
        obj=null;       
}

我们循环申请Object对象,并将所申请的对象放入一个Vector中,如果我们仅仅释放引用本身,那么Vector 仍然引用该对象,所以这个对象对GC来说是不可回收的。
因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将 Vector对象设置为null。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2