java - 常见的 Java 内存/引用泄漏模式?

标签 java memory-leaks reference garbage-collection

也许最典型的例子是 JDBC 关闭方式错误,没有正确处理可能的异常。我很想看看您看到的其他示例 - 最好是与 Web 应用程序相关的示例。

那么,Java 中有什么常见的泄漏模式吗?

最佳答案

根据我的经验,两种关键的“有效泄漏”模式是:

  • 随着时间的推移逐渐增长的静态和单例。这可能包括缓存、实现和使用不当的连接池、“自启动以来我们见过的每个用户”的字典等
  • 从长生命周期对象到打算短生命周期对象的引用。在 C# 中,这可以通过事件发生,而等效的观察者模式可以在 Java 中产生相同的效果。基本上,如果您要求一个对象(观察者)观察另一个对象(源),那么您通常会得到一个观察者的引用。这可能最终成为唯一的“实时”引用,但它会与源一样存在。
  • 如果您不断动态生成新代码,Permgen 就会泄漏。我在这里更艰难,但我很确定我遇到了这种方式的问题。这可能部分是由于已修复的 JRE 错误 - 自从它发生以来我已经记不清了。
  • 保留状态的单元测试可以比您预期的持续时间更长,因为 JUnit 将保留测试用例实例。我再次记不起细节,但有时这使得在拆解中明确“变量清零”变得值得,尽管看起来不合时宜。

不过,我不能说我经常发现内存泄漏是 Java(或 .NET)中的一个问题。

关于java - 常见的 Java 内存/引用泄漏模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/670791/

相关文章:

java - 将 Maven 应用程序打包到单个 jar 中 - 但有异常(exception)

java - 从日期中拆分日期和时间以单独键入

android - 对 Activity 的弱引用 (Android)

javascript - ASP.NET Ajax Dispose模式等效于jQuery吗?

Excel VBA : Late binding reference

java - 如何创建一个不引用另一个的 Arraylist?

c++ - 如何创建一个线程,其主要功能需要引用参数?

Java Couchbase 如何更新 JSON 子项?

java - spring data JPA 中 api Page<E> 的空数据

memory-leaks - 您是否需要断开所有音频节点以避免内存泄漏?