class loader 或 classes 可以在 JVM 中死掉吗?

Can class loaders or classes be dead in JVM?

class 加载程序或 class 可以在 JVM 中死掉吗?我正在阅读博客 Oracle - Garbage collection and metaspace。作者写道,当达到最大大小时,会在元空间上引发垃圾收集,结果 classloader 和 classes 被垃圾收集

我想了解对象变得无法访问是否也可以应用于 classloader 和 classes?如果是那么如何。

I wanted to understand like objects become unreachable can the same be applied for classloaders and classes as well?

是的,classloader 和 classes 在某些情况下可能无法访问。

  • 这仅适用于 class 动态创建的加载程序,以及它们加载的 classes。初始 bootstrap 和应用程序 classloader 是永久可访问的,它们加载的任何 classes (define) 将是永久可访问的。

  • 有很多可达路径,包括

    • 从 class 到其父 classloader
    • 从一个 class 加载器到它加载的每个 class
    • 从一个class到它所依赖的每个class
    • 从每个对象到其 class,以及
    • 从线程堆栈上的每个方法调用到定义该方法的 class。

简而言之,如果应用程序有任何方法可以找到或使用(加载的)class 或 classloader,那么它是可以访问的。否则我们无法访问。

If yes then how.

通过删除所有使 classloader 及其 classes 可达的路径。就像你会做一个普通的对象。

(除了它更难实现,因为许多可达性路径在幕后,应用程序代码无法直接破坏它们。因此,广泛使用动态 class 加载的应用程序的问题,动态代理等 可能 遭受元空间泄漏。)