java内存泄露辩论

来源:互联网 发布:access数据库怎么学 编辑:程序博客网 时间:2024/04/29 09:55

看到一篇内存泄露的文章:
文章中举了一个内存泄露的例子:
Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{Object o = new Object();
v.add(o);
o = null;
}//

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

在我看来 vector中的 o 已经都统统指向了 null 而 new 出来的Object 已经没有对象再应引用它了,没用被应用的对象就应当被回收啊,所以这些new Object会被释放
请教各位,我的想法错在哪里?

 

 

 

首先理解什么是引用,什么是对象。
java中我们是通过引用来操作对象的。
比如Object o = new Object();
这里的o是引用,根据o能找到新创建的对象,但是o并不是这个对象。
打个比方,o就是一个门牌号,通过门牌号能找到放对象的地方。
v.add(o);就是你把门牌号放到里面了,也就是说v通过内部的信息还能找到对象,对象不是垃圾。

 

 

一楼说的有道理,“o = null;”这条语句说的是将引用置空,垃圾回收器回收的是引用所占用的栈,而用new实例化的对象仍然占据着堆的空间(因为对象生成事默认的构造函数已经将其初始化,而现在仍不为null),所以没有被回收。个人见解,希望对你有帮助。

其实Java中不可能存在内存泄漏,因为GC会在必要的时候回收内存。
这个例子没有体现内存泄漏,但是用来理解内存泄漏的潜在发生可能还是可以的。
不需要那么复杂,一个非常简单的例子就能说明问题:
Object o1 = new Object();
Object o2 = o1;
o1 = null; // 这时o1指向的那个对象回收了吗?没有,因为它还被o2引用着
o2 = null; // 这样才能回收
实际应用中,只要o2的作用域很小,不执行o2=null也是没有问题的,因为只要o2过了它的生存期,它指向的对象就能被回收。
结论是,作用域越大的变量,越要引起重视,因为它可能占用着某些对象引用而导致对象不能被回收。换句话说,尽可能地缩小变量的作用域——这也是你在Java中关于内存方面能做的唯一努力了。

 

 

看看有向图吧,
Object o = new Object();
v.add(o);
有向图里new出来的对象有两个通路和其关联
o = null;
关闭了其中一条通路
仍然可以通过v.get(0);访问该对象
就是说v这个引用指向的对象和new出来的Object对象依然有关联
要么v.remove(0);要么v=null;

 

 

垃圾回收的机制就是,对于每一个创建的对象,JVM的内存管理器都会设置它的引用数为0,每对这个对象的引用多了一个,引用数加1,JVM会有一个线程不断的判断每一对象的引用数,当引用数小于0时,从堆中释放改对象。对于例子中的o。
o=null前,它的引用数为1.
o=null后,引用数为0,仍然不小于0,因而不释放。
如果加入,v.remove(i),引用数小于0,释放对象o在堆中的空间,此时内存得到回收。
gc的管理模型采用树一样的结构,来保证所有的对象都是可达的。但是如果因为某些原因,还是会有一些对象不再使用,但一直被引用,此时gc不会回收这些对象,就出现了所谓的内存泄露。
Java中存在内存泄露,17楼的说法是错误的!!

 

 

关键是栈和堆的概念 特别是java在处理 一楼说的很对 Object o = new Object() ;o是在栈一个单元,记录的是new object()在堆中开辟的内存地址,所以每当你使用v.add(o)实际上也就将地址copy一份记录下来,所以当o=null时只是将栈中记录地址的单元清空,而v还是有指向堆中的内存单元。GC只存在于堆中,所以在堆中开辟的内存单元在栈中还有一个记录它地址的引用,所以至少现在是不能被回收的

 

 

Vector v = new Vector(10);
for (int i = 1; i<100; i++)
{Object o = new Object();//o 是一个引用在这个是这这个应用存放的是刚刚new出来的object的地址
v.add(o);// 在v中添加了指向object的地址
o = nul…… //所以在这个时候改变o的引用是对v不起作用的,v中存放的并不是o的值,而是当时o的指向的object的引用地址

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果5s4g网络慢怎么办 苹果5s上网很慢怎么办 手机一体机死机关不了机怎么办 联想一体机关不了机怎么办 纸巾盒的吸盘老化了怎么办 粘的挂钩老掉怎么办 车载手机支架吸盘吸不住怎么办 吸盘吸不住怎么办才好? 行车记录仪吸盘吸不住怎么办 小米儿童手表二维码丢了怎么办 艾蔻手表二维码丢失了怎么办 玩具直升机遥控器坏了怎么办 玩具飞机遥控器坏了怎么办 玩具无人机遥控器坏了怎么办 玩具遥控车遥控器坏了怎么办 用遥控器关电视后打不开怎么办 汽车遥控器按键坏了怎么办 用遥控器关了电视打不开怎么办 遥控器一个按键坏了怎么办 电视用遥控器关的打不开怎么办 电动车遥控器按键坏了怎么办 海尔空调遥控器按键坏了怎么办 汽车手机支架吸盘吸不住怎么办 车载手机支架吸盘坏了怎么办 假牙的吸盘坏了怎么办 燃气费用一直未交怎么办 凌度gps模块无法定位怎么办? 放疗定位线掉了怎么办 被网络平台骗了怎么办 手机重力传感器坏了怎么办 锤子手机重力传感器坏了怎么办 平板电脑没有开关键怎么办 手机重力感应器坏了怎么办 苹果手机重力感应器坏了怎么办 苹果手机陀螺仪坏了怎么办 狗狗的爪子肿了怎么办 压缩文件之后显示拒绝访问怎么办 压缩文件解压后全散开了怎么办 dnf助手改名字用完了怎么办 缅甸 佤邦 办中国护照 怎么办? 电脑玩游戏网络延迟大怎么办