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

时间:2014-06-08 17:04:46

标签: java jvm debug-symbols jvmti

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

  • 在C
  • 中编写一个简单的JVMTI共享对象
  • 当在Java-land中抛出异常时,触发JVMTI函数
  • JVMTI lib中的代码暂停抛出异常的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

1 个答案:

答案 0 :(得分:0)

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