【问题标题】:Understanding memory leaks in Java . What are the classes that persist through out the life of a Java application?了解 Java 中的内存泄漏。在 Java 应用程序的整个生命周期中持续存在的类有哪些?
【发布时间】:2012-09-03 06:22:12
【问题描述】:

来自IBM article on handling memory leaks in Java

垃圾收集器从根节点开始,持续存在的类 贯穿 Java 应用程序的整个生命周期,并横扫所有 被引用的节点。当它遍历节点时,它保持 跟踪哪些对象正在被主动引用。任何类 不再被引用然后有资格成为垃圾 集。可以返回这些对象使用的内存资源 删除对象时发送到 Java 虚拟机 (JVM)。

在 Java 应用程序的整个生命周期中存在哪些类?

【问题讨论】:

  • EDT 持有的任何东西,框架管理的任何东西等,应用程序起点持有的实例。
  • 因为java类继承自唯一一个类Object所以这个类是通过java app持久化的
  • @Geek EDT 是事件调度线程,是处理 Swing/AWT 的后台内容。 docs.oracle.com/javase/tutorial/uiswing/concurrency/…
  • 它不是依赖于应用程序吗?你如何概括这一点?您的应用程序可能有 X 类,而我的应用程序有 Y 类,所以我觉得这个问题的答案将取决于应用程序。

标签: java memory-leaks


【解决方案1】:

您所问的也称为垃圾收集根。来自Yourkit's documentation of GC roots

有几种 GC 根。一个对象可以属于一种以上的根。根类是:

Class - 由系统类加载器加载的类。这样的类永远无法卸载。它们可以通过静态字段保存对象。请注意,自定义类加载器加载的类不是根,除非 java.lang.Class 的相应实例恰好是其他类型的根。

线程 - 实时线程

Stack Local - Java 方法的局部变量或参数

JNI Local - JNI 方法的局部变量或参数

JNI Global - 全局 JNI 参考

使用的监视器 - 用作同步监视器的对象

由 JVM 持有 - JVM 出于其目的从垃圾收集中持有的对象。实际上,此类对象的列表取决于 JVM 实现。可能的已知情况有:系统类加载器、JVM 知道的一些重要的异常类、一些用于异常处理的预分配对象以及在加载类的过程中的自定义类加载器。不幸的是,JVM 完全没有为这些对象提供额外的细节。因此,由分析人员决定某个“由 JVM 持有”属于哪种情况。

您也可以从The Truth About Garbage Collection(日期)阅读。

【讨论】:

    【解决方案2】:

    您的问题没有“通用”答案。每个程序将只保留“活动”类(假设程序在足够的内存压力下运行足够长的时间以强制非活动类退出)

    当您的 java 程序启动时,java 将加载您的包含 public static void main(String []) 方法的类...它实例化的任何类和对象或引用将在您遵循执行链时按需加载.

    如果主类分叉任何将创建并行实时执行路径的线程。

    每个执行路径都有一个关联的调用堆栈。

    每个调用堆栈引用的每个类和对象都代表了 java 中初始 live set 的起点。跟踪该活动集中的每个引用,您将找到所有活动对象。 JVM 规范保证所有活动的对象和类都将被保留。 (这并不意味着其他人不会被惰性 JVM 保留,但他们无法访问,所以谁在乎)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多