创建具有更大 object header 的自定义 JVM
Creating a custom JVM with larger object header
出于各种原因,我得出的结论是,创建自定义 JVM 构建可能是我想要实现的最简单的选择,因为如果不这样做,有太多的事情会严重影响性能。
所以我准备好了环境 运行,修改了一些简单的东西来为我需要的东西生成一些回调,玩了一些内部函数,到目前为止一切顺利。
不过我想知道的是:这里的 JVM 专家如何看待创建具有更大 object header(例如多 8 个字节)的自定义 VM 的可行性。 markOop.hpp
以一种非常好的方式为存在的不同风格(32 位、64 位、带有压缩 oops 的 64 位)解释了标记词的内容,我想知道扩展 header 会有多难所以我可以在 object 上添加一些额外的信息(没有标记不是选项,请参阅我的 post )。
因此,在深入研究之前,我希望有这方面经验的人可以提供一些早期反馈。就像 "suicide mission" 一样,因为有太多地方有关于 header 大小和偏移量的硬编码假设?还是所有这些都相当集中并且可以通过合理的努力来完成而不用冒破坏一切的风险?任何关于可能需要特别注意的事情以及这可能会产生什么后果的指针(除了非常明显的;更多的内存消耗)?
扩大objectheader肯定是可以的(我以前见过这样的实验),虽然这不会像在[=14中添加一个新字段那么容易=].我相信 JVM 代码中有多个地方依赖于 object header 的大小,但不应该太多。 object header 的大小已经根据平台和 UseCompressedOops
选项而有所不同,因此代码中的大多数地方已经使用了相对偏移量并且不会受到新字段的影响。
另一个选项不是扩展 header,而是向 java.lang.Object
class 添加一个新的假字段。 HotSpot 已经有添加此类字段的机制,请查找 InjectedField in the sources. However, this won't be trivial either. There are some hardcoded offsets for system classes, see JavaClasses::check_offsets。这些也需要修复。
这两种方法在实施工作方面大致相同。在这两种情况下,我建议从 JVM 的 debug
(而不是 fastdebug
)构建开始,因为它们包含许多有用的断言,可以及早发现可能的偏移问题。
听说过你的项目,我想你还有第三种选择:放弃 "JVMTI only" 要求并利用字节码检测和 JIT 编译的力量重写 Java 中代理的某些部分.是的,这可能会稍微改变正在执行的 Java 代码,并可能导致加载更多 classes,但这真的很重要吗,如果从用户的角度来看,影响甚至小于 JVMTI-only ] 代理人?我的意思是,如果没有 Java<->native 开关、JVMTI 开销等,性能影响可能会小得多。如果代理的开销很低并且可以使用普通 JVM,我想在生产环境中开启它以获得它的酷特性不是什么大问题,对吗?
出于各种原因,我得出的结论是,创建自定义 JVM 构建可能是我想要实现的最简单的选择,因为如果不这样做,有太多的事情会严重影响性能。
所以我准备好了环境 运行,修改了一些简单的东西来为我需要的东西生成一些回调,玩了一些内部函数,到目前为止一切顺利。
不过我想知道的是:这里的 JVM 专家如何看待创建具有更大 object header(例如多 8 个字节)的自定义 VM 的可行性。 markOop.hpp
以一种非常好的方式为存在的不同风格(32 位、64 位、带有压缩 oops 的 64 位)解释了标记词的内容,我想知道扩展 header 会有多难所以我可以在 object 上添加一些额外的信息(没有标记不是选项,请参阅我的 post
因此,在深入研究之前,我希望有这方面经验的人可以提供一些早期反馈。就像 "suicide mission" 一样,因为有太多地方有关于 header 大小和偏移量的硬编码假设?还是所有这些都相当集中并且可以通过合理的努力来完成而不用冒破坏一切的风险?任何关于可能需要特别注意的事情以及这可能会产生什么后果的指针(除了非常明显的;更多的内存消耗)?
扩大objectheader肯定是可以的(我以前见过这样的实验),虽然这不会像在[=14中添加一个新字段那么容易=].我相信 JVM 代码中有多个地方依赖于 object header 的大小,但不应该太多。 object header 的大小已经根据平台和 UseCompressedOops
选项而有所不同,因此代码中的大多数地方已经使用了相对偏移量并且不会受到新字段的影响。
另一个选项不是扩展 header,而是向 java.lang.Object
class 添加一个新的假字段。 HotSpot 已经有添加此类字段的机制,请查找 InjectedField in the sources. However, this won't be trivial either. There are some hardcoded offsets for system classes, see JavaClasses::check_offsets。这些也需要修复。
这两种方法在实施工作方面大致相同。在这两种情况下,我建议从 JVM 的 debug
(而不是 fastdebug
)构建开始,因为它们包含许多有用的断言,可以及早发现可能的偏移问题。
听说过你的项目,我想你还有第三种选择:放弃 "JVMTI only" 要求并利用字节码检测和 JIT 编译的力量重写 Java 中代理的某些部分.是的,这可能会稍微改变正在执行的 Java 代码,并可能导致加载更多 classes,但这真的很重要吗,如果从用户的角度来看,影响甚至小于 JVMTI-only ] 代理人?我的意思是,如果没有 Java<->native 开关、JVMTI 开销等,性能影响可能会小得多。如果代理的开销很低并且可以使用普通 JVM,我想在生产环境中开启它以获得它的酷特性不是什么大问题,对吗?