Item 6: Eliminate obsolete object references 消除过期对象

时间:2022-05-02 09:07:03

Item 6: Eliminate obsolete object references

消除过期对象

Generally speaking, whenever a class manages its own memory, the programmer

should be alert for memory leaks.

当一个类自己来管理内存的时候,程序员必须要警惕内存泄露。

什么叫自己管理内存呢,书上的例子是一个堆栈的例子。这个类当中维护了一个对象数组(比较耗内存),并且活动和非活动的区域由程序员来控制(自己管理),所以当活动的部分变成不可及部分时要告诉gc知道,以便及时的回收。

 

Another common source of memory leaks is caches.

另一种内存泄露常常来自缓存。

把一个对象加到缓存里面去,通常容易被遗忘。当它不再有用后很长时间可能还在内存中。怎样避免这个问题?当缓存中的对象过期,那么即时清除。但是是否过期,这个不好判断,所以可以采用定时清除。另外书中提到用LinkedHashMapremoveEldestEntry,没有用过

查了下资料:

 

LinkedHashMap

 LinkedHashMap扩展HashMap,以插入顺序将关键字/值对添加进链接哈希映像中。象LinkedHashSet一样,LinkedHashMap内部也采用双重链接式列表。

  (1) LinkedHashMap(): 构建一个空链接哈希映像

  (2) LinkedHashMap(Map m): 构建一个链接哈希映像,并且添加映像m中所有映射

  (3) LinkedHashMap(int initialCapacity): 构建一个拥有特定容量的空的链接哈希映像

  (4) LinkedHashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的链接哈希映像

  (5) LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder): 构建一个拥有特定容量、加载因子和访问顺序排序的空的链接哈希映像

  如果将accessOrder设置为true,那么链接哈希映像将使用访问顺序而不是插入顺序来迭代各个映像。每次调用get或者put方法时,相关的映射便从它的当前位置上删除,然后放到链接式映像列表的结尾处(只有链接式映像列表中的位置才会受到影响,哈希表元则不受影响。哈希表映射总是待在对应于关键字的哈希码的哈希表元中)。

  该特性对于实现高速缓存的删除最近最少使用的原则很有用。例如,你可以希望将最常访问的映射保存在内存中,并且从数据库中读取不经常访问的对象。当你在表中找不到某个映射,并且该表中的映射已经放得非常满时,你可以让迭代器进入该表,将它枚举的开头几个映射删除掉。这些是最近最少使用的映射。

  (6) protected boolean removeEldestEntry(Map.Entry eldest): 如果你想删除最老的映射,则覆盖该方法,以便返回true。当某个映射已经添加给映像之后,便调用该方法。它的默认实现方法返回false,表示默认条件下老的映射没有被删除。但是你可以重新定义本方法,以便有选择地在最老的映射符合某个条件,或者映像超过了某个大小时,返回true

A third common source of memory leaks is listeners and other callbacks.

第三种形式的内存泄露是监听器以及其他形式的回调。

如果你注册了却没有注销的话,那么就会造成内存泄露。

The best way to

ensure that callbacks are garbage collected promptly is to store only weak references

to them, for instance, by storing them only as keys in a WeakHashMap.

不是很明白?