【问题标题】:How to know if Static Block Initialization has been run?如何知道静态块初始化是否已运行?
【发布时间】:2013-05-02 13:15:14
【问题描述】:

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

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

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

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


注意:

对于任何提议使用 ClassLoader 的 findLoadedClass 的人,在规范中有这么重要的一句话:*在这篇文章中,有一个重要的说明:“loaded”并不意味着“initialized”。初始化只发生在 JLS3 $12.4.1 *

定义的精确时刻

【问题讨论】:

  • stackoverflow.com/questions/3678579/… 我想这就是您要搜索的内容
  • 你怎么知道静态块是内存链接的原因?您是否进行了广泛的介绍?除非您确定原因,否则过早地尝试优化是个坏主意。
  • @LionC 查看我帖子的编辑
  • @PlatinumAzure 是的。顺便说一句,大多数内存泄漏是由于静态变量保持类加载器的引用或其他什么......当然,通过反射手动重置值不是一个好习惯,但在这种情况下,这就是我想要做的

标签: java reflection static-initialization


【解决方案1】:

static 块在类加载到 JVM 时被初始化。

你可以用ClassLoader检测到JVM上的类是否加载

【讨论】:

  • 在这篇文章中,有一个重要说明:“已加载”并不意味着“已初始化”。初始化只发生在 JLS3 $12.4.1 定义的精确时刻
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多