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 加载的应用程序的问题,动态代理等 可能 遭受元空间泄漏。)
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 加载的应用程序的问题,动态代理等 可能 遭受元空间泄漏。)