A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wq10zj 中级黑马   /  2014-2-17 11:37  /  813 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

请看下我的描述 啦(不是很会造句哒):
有内存泄露吗?
答:有,所谓内存泄露就是某个对象不用了,但没有被释放掉,这就是内存泄露

     但是java中不是有GC吗   首先产生的疑问是  这个对象被修改后
     其内存地址发生了变化,之前经过修改的对象的值会被释放,
     如果经过修改赋给的新值,因为hashCode的变化,导致要想对其操作时
     这个值因为内存地址的改变无法查找到,从而藏在了内存的某一块区域中
   
     但是你说他没有被释放   这是为什么呢?
     我知道他没有被用到,但是在java中难道没有被用到的对象  必须要经过使用后才能被释放
     吗?
     所以产生的疑问是:java中释放内存的条件是什么,是根据什么来释放内存的额?

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

2 个回复

倒序浏览
没用到的对象,或用过后的不需要对象,java虚拟机会自动调用垃圾回收器,释放空间。不过这时间上是不确定的。
回复 使用道具 举报
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。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马