2013-05-02 113 views
0

我想摆脱一些内存泄漏。我想从类加载器中重置所有类的所有静态变量(不仅是我的)。有一个classes属性列出了ClassLoader已知的所有类。如何知道静态块初始化是否已经运行?

所以我只是想循环它,并用反射将静态变量设置为null。

问题是所有这些类都没有被初始化(静态块初始化没有运行)。目的是重新设置这些值然后卸载这些类,所以没有必要对这些类进行初始化。此外,当我重置在另一个类CHILD的SBI中使用的类ROOT时,运行CHILD的SBI可能会导致意外的行为...

所以问题是:有没有办法知道SBI已由JVM运行或不运行。


注:

任何人提议用classloader的findLoadedClass,有在规范这个重要的一句话:*在这篇文章中,有一个重要的提示:“装载”没有按” t意思是“初始化”。初始化仅在JLS3定义的精确时刻发生$ 12.4.1 *

+1

http://stackoverflow.com/questions/3678579/how-to-check-whether-a-class-is-initialized我认为这是什么youre搜索 – LionC 2013-05-02 13:17:34

+0

你怎么知道静态块是存储器链接的原因?你有广泛的个人资料吗?除非您确切知道原因,否则尝试过早优化是一个糟糕的主意。 – 2013-05-02 13:18:45

+0

@LionC查看我的帖子编辑 – poussma 2013-05-02 13:39:56

回答

0

static如果在JVM上加载了类,则会初始化块。

上加载JVM类,你可以检测ClassLoader

+1

在这篇文章中,有一个重要的注意事项:***“加载”并不意味着“初始化”。初始化只发生在由JLS3 $ 12.4.1定义的精确时刻*** – poussma 2013-05-02 13:36:45