启用JVMTI *function*以查询局部变量的开销

我正在研究一种在JVM上运行的简单动态语言。 其中一个必需的function是: 只有在抛出exception时 ,我才能在抛出exception时查询调用堆栈中所有帧的局部变量。 标准Java或reflection中不提供此function。 因此,我正在考虑以下想法:

  • 在C中编写一个简单的JVMTI共享对象
  • 在Java-land中抛出exception时,触发JVMTI函数
  • JVMTI lib中的代码暂停抛出exception的Java线程,检查堆栈以提取本地,将它们存储在可访问的位置,并恢复Java线程

除了在这种情况下,JVMTI根本不会被使用。 代码可能会运行几天而不会抛出exception,我希望它的运行速度与非启用JVMTI的代码一样快。

所以我的问题是 :在主流的JVM实现( Oracle)中,启用我需要的JVMTIfunction的开销是多少? 例如,这样做会禁用JIT吗?

我对JVMTI“能力”的最佳猜测是:

  • can_signal_thread
  • can_get_source_file_name
  • can_get_source_debug_extension
  • can_access_local_variables

您提到的JVMTIfunction不会阻止JIT编译。 但是,某些优化将被禁用,例如Escape Analysis和dead locals消除。
此外,每个抛出的exception都会导致去优化(切换到解释器)。
然而,整体性能开销应该可以忽略不计。