【问题标题】:Java garbage collection of run-time generated code运行时生成代码的 Java 垃圾收集
【发布时间】:2009-07-15 19:52:43
【问题描述】:

我正在研究在运行时生成 Java 字节码的可能性(希望直接在内存中而不是通过类文件,尽管我想这不会对我的问题产生影响)。

我知道这是可以做到的,问题是,垃圾收集器会清理不再使用的代码吗?我记得几年前看到它声称它没有,但我现在找不到任何关于该主题的参考。

为了澄清这样做的目的,我当然不会为普通的数据处理场景而烦恼。但是考虑一下基因编程:可能会生成数十亿个小程序并运行数万亿次;在这种情况下,值得尝试让事情尽可能快地运行,并且释放不再使用的代码很重要。我正在尝试做一些更复杂的事情,但它与基因编程有相似之处。

【问题讨论】:

  • 鉴于您的示例(大量小类),我建议查看不涉及 Java 类的解决方案。为这些类中的每一个创建类加载器的开销将是极大的。相反,请寻找某种本土解释器。
  • 但是你不能创建一个单一的类加载器并将它用于大量的类,然后在你删除对加载器的所有引用时一次性释放它们吗?
  • 是的——前提是您不想保留一些而丢弃其他的(就像遗传算法那样)。
  • 但是,创建类有开销:解析类数据和构建内部数据结构所花费的时间。如果你要上很多课,这个时间会很重要。而且,如果您的类很小并且(相对)短命,那么您将不会从 JIT 编译中受益,因此您不会看到构建 Java 字节码的任何真正的速度优势。事实上,情况可能正好相反:如果你创建一个解释器,解释器的方法将被热点编译,并且应该比未编译的字节码运行得更快。
  • 借助解释器,您还可以定义比 Java 字节码范围更广的操作。有关详细信息,请参阅en.wikipedia.org/wiki/Domain_specific_language

标签: java garbage-collection code-generation


【解决方案1】:

类与加载它们的类加载器相关联。要使 JVM 收集未使用的类,您必须清除对类加载器的所有引用。这就是应用程序服务器如何使用“热部署”的方式,如果您不熟悉类加载器,查看 JBoss 或 Tomcat 实现可能会很有启发性(我也没有看过,所以不能指向它们) .

但是,我想知道,这是否真的会成为一个问题?你计划创建多少个班级,他们会有多大,他们会活多久?如果您有很多大型类(例如 50k 或更多字节码),并且它们的生存时间很短,那么清理它们是有意义的。否则,没那么多。

另外,你为什么要创建类?是否可以在 JVM 中使用脚本语言(例如 Rhino)来完成?还是自制口译员?如果是,那么这将解决您的课程管理问题而无需代码。

【讨论】:

    【解决方案2】:

    如果你的意思是垃圾收集器卸载这个类,那么它不会。

    但是,您可以通过编写自定义类加载器来实现此目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-02
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多