我正在研究一种在JVM上运行的简单动态语言。其中一个必需的功能是:仅在抛出异常时,我需要能够在抛出异常时查询调用堆栈中所有帧的局部变量。标准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
答案 0 :(得分:0)
您提到的JVMTI功能不会阻止JIT编译。
但是,某些优化将被禁用,例如逃逸分析和消灭当地人。
此外,每个抛出的异常都会导致去优化(切换到解释器)
尽管如此,整体性能开销应该可以忽略不计。