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)的帮助,才能发现这些问题。所以,在内存泄露发生之前预测此类问题,以防它们发生,是极好的。