Java 如何知道是否已运行静态块初始化?

Java 如何知道是否已运行静态块初始化?,java,reflection,static-initialization,Java,Reflection,Static Initialization,我正试图消除一些内存泄漏。我想从类加载器中重置所有类(不仅仅是我的)的所有静态变量。有一个classes属性,列出类加载器已知的所有类 所以我只想在它上面循环,并使用反射将静态变量设置为null 问题是所有这些类都不一定已经初始化(静态块初始化没有运行)。由于其目的是重置值,然后卸载类,因此初始化此类没有意义。此外,当我重置另一个类子级的SBI中使用的类根时,运行子级的SBI可能会导致意外行为 所以问题是:有没有办法知道SBI是否由JVM运行过 注: 对于任何建议使用ClassLoader的f

我正试图消除一些内存泄漏。我想从类加载器中重置所有类(不仅仅是我的)的所有静态变量。有一个
classes
属性,列出类加载器已知的所有类

所以我只想在它上面循环,并使用反射将静态变量设置为null

问题是所有这些类都不一定已经初始化(静态块初始化没有运行)。由于其目的是重置值,然后卸载类,因此初始化此类没有意义。此外,当我重置另一个类子级的SBI中使用的类根时,运行子级的SBI可能会导致意外行为

所以问题是:有没有办法知道SBI是否由JVM运行过


注:
对于任何建议使用ClassLoader的findLoadedClass的人来说,规范中有一句重要的话:*在这篇文章中,有一条重要的提示:“loaded”并不意味着“initialized”。初始化仅在JLS3$12.4.1*定义的精确时刻发生

静态
如果类加载到JVM上,则初始化块


类是否加载在JVM上,您可以使用

进行检测我想这就是您要搜索的内容如何知道静态块是内存链接的原因?你有详细介绍过吗?除非您确定原因,否则过早地尝试优化是个坏主意。@LionC请参阅我的post@PlatinumAzure对顺便说一句,大多数内存泄漏都是由于静态变量保留了类加载器的引用或其他原因造成的。。。当然,通过反射手动重置值不是一个好的做法,但在这种情况下,这就是我想在这篇文章中做的,有一个重要的提示:“加载”并不意味着“初始化”。初始化仅在JLS3$12.4.1定义的精确时刻发生