【发布时间】:2021-03-21 08:53:19
【问题描述】:
大家好,当我观看有关 G1GC 的介绍时,我了解到,这个 GC 可以在收集垃圾期间卸载类。让我们想象一下,我们有这样一个类。
public class Foo {
public static int a = 5;
}
假设我们的代码中没有对这个类的任何引用,以便让 GC 清楚地知道这个类将不再被使用。为了使类加载和初始化发生,我们定期访问这个int a 变量。为了在代码中没有任何引用,我们通过反射来访问这个变量,在http请求调用的方法中,以类名作为参数。
在这种情况下,或任何类似情况下,是否有可能多次初始化类,这也意味着静态字段将被初始化多次?
静态字段可以初始化几次吗?
【问题讨论】:
-
静态字段未多次初始化:正在创建类的新实例,其中包含静态字段值的新实例。在您的示例中,您确实有对该类的引用,即使您只是通过加载它的类加载器反射性地访问它。
-
@Holger 你能把这个评论作为答案吗?因为它恰到好处,我想标记它。如果您能详细说明,我将不胜感激,可能的情况是我们在一个应用程序中有多个类加载器? (不是一个 JVM)为什么这个特性(类卸载)有用?仅在重新部署应用程序时,对已销毁应用程序的垃圾类加载器,而不重新启动应用程序服务器?
标签: java garbage-collection classloader g1gc