gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:48:23 25 4
gpt4 key购买 nike

我正在开发一种在 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

最佳答案

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

关于java - 启用 JVMTI *功能* 查询局部变量的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24108591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com