gpt4 book ai didi

java - 可以为可以卸载的动态编译代码获得 native 性能吗?

转载 作者:行者123 更新时间:2023-11-30 08:50:03 25 4
gpt4 key购买 nike

.Net, it seems你不能

  1. 动态编译代码
  2. 直接调用编译后的代码(即没有“远程处理”、编码等)
  3. (仅)从内存中删除编译后的代码

您必须在 2.(通过将代码生成到调用 AppDomain 本身)或 3.(通过将代码生成到一次性 AppDomain 中)之间做出决定,但您不能两者兼得。

现在我很好奇这在 Java 中是否可行。我对 ClassLoader 了解不够,但在 Java 中我似乎可以

  1. 将代码动态编译成一次性类加载器
  2. 直接调用编译后的代码(例如,通过对预定义接口(interface)的虚拟方法调用),无需任何编码(marshal)处理
  3. 删除所有对已编译类和丢弃类加载器的引用,以便 GC 负责删除

这个假设是否有效?

最佳答案

是的,你可以编译/加载一个类代码离开类加载器,调用它没有问题。

是的,动态代码将达到“完整性能”。没有区别。但是,新加载的代码将以解释模式启动,需要在编译前预热。

然而,第 3 点非常棘手。

  • “泄漏”一次性类加载器非常容易/很有可能。类加载器保留对其加载类的引用。每个类都持有对其类加载器的引用。每个对象都是对其类的引用。因此,只要您有一个对象或类的引用,该对象或类是用一次性类加载器加载的,它和它加载的类就会保持 Activity 状态。因为很容易引用对象,所以“类加载器”泄漏非常常见。
  • 这取决于 GC 配置和 JVM 版本,实际上 GC 会传递加载的类。您可能需要额外的标志来启用它。类似于 CMS GC '-XX:+CMSClassUnloadingEnabled'。
  • 有一个代码缓存(在 OpenJDK/Hotspot 中),用于保存编译后的代码。如果您在应用程序的整个生命周期中一直加载代码,您可能会超出此缓存。在较旧的 JVM 中,它刚刚填满,一旦填满,它就停止编译代码,性能下降,除非您启用刷新缓存 (-XX:+UseCodeCacheFlushing)。 Afaik 在较新的版本中默认刷新。仔细检查一下。您可能需要关注代码缓存。 (例如通过 JMX)

关于java - 可以为可以卸载的动态编译代码获得 native 性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31173645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com