key 和secret
总览
首先,很自然地假设静态字段具有特殊的生命周期,并且在应用程序的生命周期中一直存在。 您可以假设它们存在于内存中的特殊位置,例如C或类元信息的perm gen中的内存开始。
但是,得知静态字段驻留在堆上,可以具有任意数量的副本并像其他任何对象一样被GC清除,可能会令人惊讶。
这是在先前的讨论之后得出的; 静态块会被解释吗?
加载静电场
当获得用于链接的类时,它可能不会导致静态块被初始化。
一个简单的例子
public class ShortClassLoadingMain {public static void main(String... args) {System.out.println("Start");Class aClass = AClass.class;System.out.println("Loaded");String s= AClass.ID;System.out.println("Initialised");}
}class AClass {static final String ID;static {System.out.println("AClass: Initialising");ID = "ID";}
}
版画
Start
Loaded
AClass: Initialising
Initialised
您可以看到您可以在初始化类之前获得对类的引用,只有在使用该类时,该类的引用才会被初始化。
加载多个静态场
每个加载类的类加载器都有其自己的静态字段副本。 如果在两个不同的类加载器中加载一个类,则这些类可以具有具有不同值的静态字段。
卸载静电场
当类的ClassLoader被卸载时,静态字段将被卸载。 执行GC时将卸载该线程,并且线程堆栈中没有强引用。
将这两个概念放在一起
这是一个示例,其中类在初始化消息时以及在其字段完成时打印消息。
class UtilityClass {static final String ID = Integer.toHexString(System.identityHashCode(UtilityClass.class));private static final Object FINAL = new Object() {@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println(ID + " Finalized.");}};static {System.out.println(ID + " Initialising");}
}
通过重复加载此类,一次两次
for (int i = 0; i < 2; i++) {cl = new CustomClassLoader(url);clazz = cl.loadClass(className);loadClass(clazz);cl = new CustomClassLoader(url);clazz = cl.loadClass(className);loadClass(clazz);triggerGC();
}
triggerGC();
你可以看到这样的输出
1b17a8bd Initialising
2f754ad2 Initialising-- Starting GC
1b17a8bd Finalized.
-- End of GC6ac2a132 Initialising
eb166b5 Initialising-- Starting GC
6ac2a132 Finalized.
2f754ad2 Finalized.
-- End of GC-- Starting GC
eb166b5 Finalized.
-- End of GC
在此日志中,将首先加载该类的两个副本。 对第一类/类加载器的引用被对第二类/类加载器的引用覆盖。 第一个在GC上清理,第二个保留。 在第二个循环中,又初始化了两个副本。 保留第四个,在GC上清理第二个和第三个。 最后,当不再使用静态字段的第四份副本时,将在GC上清除它们。
代码
第一个示例– ShortClassLoadingMain 第二个示例– LoadAndUnloadMain
参考: Java Secret:从Vanilla Java的 JCG合作伙伴 Peter Lawrey 加载和卸载静态字段 。
- 每个程序员都应该知道的事情
- 正确记录应用程序的10个技巧
- 软件设计法则
- Java最佳实践系列
- 生存在荒野西部开发过程中的9条提示
翻译自: https://www.javacodegeeks.com/2011/10/java-secret-loading-and-unloading.html
key 和secret