也许最典型的例子是 JDBC 关闭方式错误,没有正确处理可能的异常。我很想看看您看到的其他示例 - 最好是与 Web 应用程序相关的示例。
那么,Java 中有什么常见的泄漏模式吗?
最佳答案
根据我的经验,两种关键的“有效泄漏”模式是:
- 随着时间的推移逐渐增长的静态和单例。这可能包括缓存、实现和使用不当的连接池、“自启动以来我们见过的每个用户”的字典等
- 从长生命周期对象到打算短生命周期对象的引用。在 C# 中,这可以通过事件发生,而等效的观察者模式可以在 Java 中产生相同的效果。基本上,如果您要求一个对象(观察者)观察另一个对象(源),那么您通常会得到一个从源到观察者的引用。这可能最终成为唯一的“实时”引用,但它会与源一样存在。
- 如果您不断动态生成新代码,Permgen 就会泄漏。我在这里更艰难,但我很确定我遇到了这种方式的问题。这可能部分是由于已修复的 JRE 错误 - 自从它发生以来我已经记不清了。
- 保留状态的单元测试可以比您预期的持续时间更长,因为 JUnit 将保留测试用例实例。我再次记不起细节,但有时这使得在拆解中明确“变量清零”变得值得,尽管看起来不合时宜。
不过,我不能说我经常发现内存泄漏是 Java(或 .NET)中的一个问题。
关于java - 常见的 Java 内存/引用泄漏模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/670791/