我正在研究一种在 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