Effective Java读书笔记五

     

Item 6:消除对过期对象的引用

看这个item之前没有过多的想过Java对象过期的问题。因为对象是由JVM控制的,JVM的垃圾回收机制也是Java区别于C++之类的语言的优点。可能是我一厢情愿了,所以在日常编程中忽视了这个问题。

下面是java.util.ArrayList类中remove method的摘抄:

 

在ArrayList中,元素实际上使用数组来保存的。那么当我们调用remove方法移除某一个元素后,remove方法会将空余出来的位置显式的赋予一个null:data[size] = null,这个就是对过期对象的消除。
可以仔细想象一下,如果我们的ArrayList内有100个元素,现在删除掉30个,如果没有data[size] = null这个操作,那么实际上ArrayList的内部数组还是持有对这30个对象的引用,因此JVM的垃圾回收器不会回收它们,如此下去,在最坏的情况下,就会产生OutOfMemoryError。

当然,我们不能在程序中对所有的对象都做一次null处理,这样会让我们的代码无法维护并且难以阅读。我们应该只有在需要的情况下才使用null处理,而Joshua说这种处理仅仅是一些特殊的情况,最好的方式是让引用对象的变量离开它的作用范围,JVM就会自动回收这些对象了。

那么,什么情况下需要我们对不用的对象做null处理呢?首先,当我们自己管理内存的时候才需要null处理,比如上面提到的ArrayList,它内部持有了对其它对象引用的数组。调用remove删除某个元素后,虽然我们知道这个元素不会再用了,但是因为引用的存在,JVM不能判断该对象是否还有存在的必要,因此这个对象不会被回收。
其次,需要null处理的地方是cache。我想这个就不用说了,网上有文章提到过,管理cache最好用的是弱引用。
第三个需要null处理的是监听器(listener)和回调函数。回调函数最好也是使用弱引用来代替强引用。

如果我们处理不好上面说到的这些问题,那么引发的内存泄露会是一个很头疼的问题,因为内存泄露是定位与修改是非常困难的,只能够借助诸如heap profiler之类的工具才能发现。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值