【发布时间】:2009-07-15 19:52:43
【问题描述】:
我正在研究在运行时生成 Java 字节码的可能性(希望直接在内存中而不是通过类文件,尽管我想这不会对我的问题产生影响)。
我知道这是可以做到的,问题是,垃圾收集器会清理不再使用的代码吗?我记得几年前看到它声称它没有,但我现在找不到任何关于该主题的参考。
为了澄清这样做的目的,我当然不会为普通的数据处理场景而烦恼。但是考虑一下基因编程:可能会生成数十亿个小程序并运行数万亿次;在这种情况下,值得尝试让事情尽可能快地运行,并且释放不再使用的代码很重要。我正在尝试做一些更复杂的事情,但它与基因编程有相似之处。
【问题讨论】:
-
鉴于您的示例(大量小类),我建议查看不涉及 Java 类的解决方案。为这些类中的每一个创建类加载器的开销将是极大的。相反,请寻找某种本土解释器。
-
但是你不能创建一个单一的类加载器并将它用于大量的类,然后在你删除对加载器的所有引用时一次性释放它们吗?
-
是的——前提是您不想保留一些而丢弃其他的(就像遗传算法那样)。
-
但是,创建类有开销:解析类数据和构建内部数据结构所花费的时间。如果你要上很多课,这个时间会很重要。而且,如果您的类很小并且(相对)短命,那么您将不会从 JIT 编译中受益,因此您不会看到构建 Java 字节码的任何真正的速度优势。事实上,情况可能正好相反:如果你创建一个解释器,解释器的方法将被热点编译,并且应该比未编译的字节码运行得更快。
-
借助解释器,您还可以定义比 Java 字节码范围更广的操作。有关详细信息,请参阅en.wikipedia.org/wiki/Domain_specific_language
标签: java garbage-collection code-generation