繁体   English   中英

了解Java中的内存泄漏。 在Java应用程序的整个生命周期中可以保留哪些类?

[英]Understanding memory leaks in Java . What are the classes that persist through out the life of a Java application?

这篇有关处理Java中的内存泄漏的IBM文章中

垃圾收集器从根节点开始,这些类在Java应用程序的整个生命周期中都持续存在,并遍历所有引用的节点。 当它遍历节点时,它会跟踪正在主动引用哪些对象。 然后,不再引用的任何类都可以进行垃圾回收。 删除对象后,这些对象使用的内存资源可以返回给Java虚拟机(JVM)。

在Java应用程序的整个生命周期中可以保留哪些类?

您要问的也称为垃圾收集根。 Yourkit的GC根目录文档中

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

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

线程-活动线程

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

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

JNI Global-全球JNI参考

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

由JVM保留-JVM从其垃圾回收中保留的对象。 实际上,此类对象的列表取决于JVM的实现。 可能的已知情况是:系统类装入器,JVM知道的一些重要异常类,一些用于异常处理的预分配对象以及在装入类的过程中的自定义类装入器。 不幸的是,JVM绝对不提供此类对象的其他详细信息。 因此,由分析人员决定某个“由JVM托管”属于哪种情况。

您也可以从关于垃圾收集的真相 (日期)中阅读它。

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

当您的Java程序启动时,Java将加载包含公共静态void main(String [])方法的类...它所实例化或引用的任何类和对象将按照您的执行链按需加载。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM