读书人

Effective Java:Ch2_创设销毁对象:I

发布时间: 2013-02-19 11:11:40 作者: rapoo

Effective Java:Ch2_创建销毁对象:Item6_消除无用的对象引用

当你从手工管理内存的语言(如C、C++)转到自动垃圾回收的语言后,编程工作会变得更加轻松,因为对象用完后会被自动回收。当你第一次经历自动垃圾回收的时候,会觉得不可思议。这容易给人一个印象:你无需考虑内存管理。其实不然。

【例】考虑下面这个简单的stack实现:

 public class LinkedHashMap...{    void addEntry(int hash, K key, V value, int bucketIndex) {        createEntry(hash, key, value, bucketIndex);        // Remove eldest entry if instructed, else grow capacity if appropriate        Entry<K,V> eldest = header.after;        if (removeEldestEntry(eldest)) {            removeEntryForKey(eldest.key);        } else {            if (size >= threshold)                resize(2 * table.length);        }    }    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {        return false;    }}
——可以继承LinkedHashMap,覆盖其removeEldestEntry方法。


内存泄露的第三个常见来源是监听器和其他回调。如果你实现了一个API,客户端在其中注册回调,但是没有显式地取消注册,那么这些回调就会积累起来除非你采取某些行动。确保回调能被即时地垃圾回收的最好途径是,值保存他们的弱引用,例如,将他们作为WeakHashMap的键来保存。


由于内存泄露通常不会表现为明显的失败,所以它们可能会在系统中存在很多年。往往只能通过仔细的代码检查,或借助调试工具(heap profiler)的帮助,才能发现这些问题。所以,在内存泄露发生之前预测此类问题,以防它们发生,是极好的。



读书人网 >编程

热点推荐