1, 最常见的Java 中的内存溢出就是 一下静态的容器 HashMap, List 之类的容器了。 由于是静态的的容器它们的生命周期就是创建之后就跟jvm 相同。 因此它们里面的object 们也会被他们hold 住, 即使别的地方都已经用完了, 如果没有显示的从他们这移除, 那些object 也会永远存在。 如果是这种容器的作用是作为cache 的话 还是用 memcache 来完成吧。 绝大多数的cache 容器是使用 SoftReference 来hold 住 target object的。 SoftReference refer 的对象如果在别的地方没有被引用了, 在GC 做 full collection 的时候会回收这些对象的。
2, 是一样事件处理的地方 我们会add Some listener 。 通常我们都是只记得加 不记得 un register。 这样在加的地方 对象用完了 但是 被监听的对象 还在的话。 listen 的对象也不会被 释放。 这个情况在dotNet 下面, 特别当初做 win form的时候很郁闷啊, 一个winform 程序在那个时候 占个 1,200m 内存。 在 05,06 512m内存都是大的了。 最后发现很多控件没有释放掉就是这种原因, 搞得还骂微软, 到了 java 世界也有这个问题。 好像现在dotNet 都是在处理这种delegate 的时候用到 softreference 了。 到底是用到 soft reference 还是 weak reference 还得向 一哥们求证下。 ( 特此记录下 )