根据我的经验,两个关键的“有效泄漏”模式是:
- 静力学和单例随着时间的推移逐渐增长。这可能包括缓存,实现不当和未使用的连接池,“自启动以来我们见过的每个用户”的字典等
- 从寿命长的对象到 打算 是寿命短的对象的引用。在C#中,事件可能会发生,等效的观察者模式可能在Java中产生相同的效果。基本上,如果您要一个对象(观察者)观看另一个对象(源),则通常会得到 从 源 到 观察者的引用。最终可能是唯一的“实时”引用,但是只要有来源,它就会一直存在。
- 如果您继续动态生成新代码,则Permgen会泄漏。我在这里处于更艰难的境地,但是我很确定自己已经遇到这种问题。这很可能部分是由于JRE错误已被修复-自从发生以来已经太久了,我无法确定。
- 保持状态的单元测试的持续时间可能比您预期的更长,因为JUnit会保持测试用例的实例。同样,我不记得详细信息,但是有时候这样做值得在拆解中具有显式的“可变空值”,看起来不合时宜。
我不能说我经常发现内存泄漏是Java(或.NET)中的问题。



