1

我正在研究一种在 JVM 上运行的简单动态语言。所需的功能之一是:只有在抛出异常时,我才需要能够在抛出异常时查询调用堆栈中所有帧的局部变量。此功能在标准 Java 或反射中不可用。因此,我正在研究以下想法:

  • 用 C 写一个简单的 JVMTI 共享对象
  • 当在 Java 领域引发异常时,触发 JVMTI 函数
  • JVMTI 库中的代码挂起引发异常的 Java 线程,检查堆栈以提取局部变量,将它们存储在可访问的位置,然后恢复 Java 线程

除了在这一种情况下,根本不会使用 JVMTI。代码可能会运行数天而不会引发异常,我希望它的运行速度与未启用 JVMTI 的代码一样快。

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

我对所需的 JVMTI “功能”的最佳猜测是:

  • can_signal_thread
  • can_get_source_file_name
  • can_get_source_debug_extension
  • can_access_local_variables
4

1 回答 1

0

您提到的 JVMTI 功能不会阻止 JIT 编译。然而,某些优化将被禁用,例如逃生分析和死本地人消除。
此外,每个抛出的异常都会导致去优化(切换到解释器)。
尽管如此,整体性能开销应该可以忽略不计。

于 2014-06-09T13:55:01.897 回答