- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我部署了一个简单的 JVMTI 代理来测试字节码检测。我的策略是在 CompiledMethodLoad
回调中调用 RetransformClasses
函数来调用 ClassFileLoadHook
。为此,我编写了以下代码:
err = (*jvmti)->GetMethodDeclaringClass(jvmti, method, &klass);
check_jvmti_error(jvmti, err, "Get Declaring Class");
err = (*jvmti)->RetransformClasses(jvmti, 1, &klass);
check_jvmti_error(jvmti, err, "Retransform class");
此函数通过调用 ClassFileLoadHook
事件正常工作,但它需要很多时间,而我只是在其中传递相同的类。我的 ClassFileLoadHook
回调函数是空的。我正在计算一个简单矩阵乘法算法的时间。通过注释掉 RetransformClasses
函数,我得到了 0.8 秒
数量级的执行时间。而仅编写此函数会将执行时间提高到大约 15 秒
。
它应该占用那么多开销还是我做错了什么?
问候
static int x = 1;
void JNICALL
compiled_method_load(jvmtiEnv *jvmti, jmethodID method, jint code_size,
const void* code_addr, jint map_length, const jvmtiAddrLocationMap* map,
const void* compile_info) {
jvmtiError err;
jclass klass;
char* name = NULL;
char* signature = NULL;
char* generic_ptr = NULL;
err = (*jvmti)->RawMonitorEnter(jvmti, lock);
check_jvmti_error(jvmti, err, "raw monitor enter");
err = (*jvmti)->GetMethodName(jvmti, method, &name, &signature,
&generic_ptr);
check_jvmti_error(jvmti, err, "Get Method Name");
printf("\nCompiled method load event\n");
printf("Method name %s %s %s\n\n", name, signature,
generic_ptr == NULL ? "" : generic_ptr);
if (strstr(name, "main") != NULL && x == 1) {
x++;
err = (*jvmti)->GetMethodDeclaringClass(jvmti, method, &klass);
check_jvmti_error(jvmti, err, "Get Declaring Class");
err = (*jvmti)->RetransformClasses(jvmti, 1, &klass);
check_jvmti_error(jvmti, err, "Retransform class");
}
if (name != NULL) {
err = (*jvmti)->Deallocate(jvmti, (unsigned char*) name);
check_jvmti_error(jvmti, err, "deallocate name");
}
if (signature != NULL) {
err = (*jvmti)->Deallocate(jvmti, (unsigned char*) signature);
check_jvmti_error(jvmti, err, "deallocate signature");
}
if (generic_ptr != NULL) {
err = (*jvmti)->Deallocate(jvmti, (unsigned char*) generic_ptr);
check_jvmti_error(jvmti, err, "deallocate generic_ptr");
}
err = (*jvmti)->RawMonitorExit(jvmti, lock);
check_jvmti_error(jvmti, err, "raw monitor exit");
}
最佳答案
要回答我的问题:
No. I wasn't doing anything wrong. It's supposed to take that much overhead.
证据如下:
我用了Jitwatch对问题有一些了解。我分析了 ClassLoad
时间检测和 JIT 调用后的检测。我在这两种情况下都使用相同的应用程序代码。
执行时间:大约 18 秒
执行时间:大约 80 秒
我们可以在这里清楚地看到,当我尝试通过调用 CompiledLoadEvent
中的 RetransformClasses
-> CLassFileLoadHook
序列来检测我的代码时,JIT 只是停止然后永远不会为我尝试检测的函数调用。之后它甚至不进行 OSR 编译。我在这个 answer 中总结了 JIT 这种行为的原因。 .后续问题给出here .欢迎知道解决方法的任何人回答。
关于java - JVMTI RetransformClasses() 花费了大量时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41327794/
我想调试使用我编写的 jvmti 代理的 java 应用程序。这似乎仅在 jvmti 代理未尝试启用“can_generate_breakpoint_events”功能时才有效。 尝试启用断点功能并在
我正在使用 JVMTI 库编写一个 Java 原生代理,并尝试获得访问局部变量的能力。在 OnLoad 阶段加载代理时,可以启用该功能,但是在实时阶段(OnAttach)加载它时似乎不可能,当我尝试添
我正致力于将橡皮擦数据争用检测算法作为 JVMTI 代理来实现。当我尝试运行一些示例输入来测试我的代码时,JVM 崩溃,转储如下所示(也可能显示相同错误的其他堆栈跟踪): native 方法中的 fa
感谢 JVMTI 代理,我正在记录我的 Java 应用程序中的所有方法条目。现在,我能够获取每个方法的名称,但我希望能够获取该方法接收到的参数值。 此问题已在较早的主题中讨论过(参见 How to g
我有两个问题 redefineClasses 可以与支持 JIT 的 JVM 一起使用吗? 如果是这样,在多线程应用程序中,如果一个线程使用 redefineClasses 重新定义一个类,另一个线程
我想知道是否可以使用 JVMTI 动态检测 Java 中的死锁。有两个事件指示使用同步语句在监视器上执行的操作: 监控竞争输入 Sent when a thread is attempting to
我正在使用 JVM 工具界面。我正在尝试使用 SetSystemProperty() 调用在 Agent_OnLoad 事件中创建 SystemProperty。如果该属性存在,它会正确设置一个新值。
我注册了一个JVMTI Event MethodEntry,它的回调函数是tdMethodEntry 如果有很多MethodEntry 事件,我的问题是 these event will be pro
我试图通读整个 jvmti 文档,但没有找到解决问题的方法。 我想获取在命令行中用于调用程序的类/文件的名称: java -agentpath: 在大写的情况下,我想获取 的名称。 GetSour
使用 MethodEntry和 MethodExit JVMTI 提供的事件 Hook 如何测量在 Java 中执行的方法的时间? 简单来说就是:time2 - time1但我看到的问题是,如何区分不
如何获取JVM TI _jclass的名称?我想显示 JVMTI 代理中加载的类的名称,但是我不清楚如何从 _jclass 实例获取类的名称。 最佳答案 这是你想要的吗? #include #i
我打算使用 Oracle 提供的 JVMTI API 开发一个分析器。对于可视化,我想在代理代码之上实现一个 GUI(Qt 框架)。我的第一个 jvmti agent 已经编译运行,我开始将它集成到我
出于各种目的,我在运行时检测类文件。为此,我正在使用 JVMTI 代理。我检测方法的策略是调用 RetransformClasses 函数来调用 ClassFileLoadHook。此策略适用于所有在
我正在使用附加 API 在运行时加载 JVMTI 代理。我想在我的程序完成时卸载 JVMTI 代理,而不终止加载代理的 JVM。根据 this documentation无法通过附加 API 执行此操
是否有可能获得完整的命令行以及用于启动当前 Java 进程并在 JVMTI 的 OnLoad 阶段获得的所有参数? 最佳答案 我咨询过JVMTI reference而且我认为它不是 native 提供
我部署了一个简单的 JVMTI 代理来测试字节码检测。我的策略是在 CompiledMethodLoad 回调中调用 RetransformClasses 函数来调用 ClassFileLoadHoo
编写分析我也会实现堆分析的典型任务。具体我想跟踪一下,哪个线程分配了多少数据?使用 JVMTI,我认为 Hook 到事件 VM Object Allocation 和 Object Free 就足够了
我正在使用 JVMTI 为 Java 应用程序编写一个检测工具。我已经看到 JVMTI 检测何时抛出异常以及何时根据 http://docs.oracle.com/javase/7/docs/plat
我们最近将一个网络应用程序(tomcat 5.5.x 网络应用程序)投入生产,它今天开始表现出奇怪的行为。我们在任何开发或预生产环境中都没有看到这种行为。 我们在运行时对生产系统的唯一看法是日志记录。
有没有我可以在 JVMTI 之上使用的不错的 Java API? 最佳答案 JVMTI 不是为在顶部安装 Java API 而构建的。 JVM TI 定义本身说: The JVM tool inter
我是一名优秀的程序员,十分优秀!