使用JVMTI提供的MethodEntry
和MethodExit
事件挂钩,我如何测量在Java中执行的方法的时间?
简单的说法就是:time2 - time1
但我看到的问题是,如何区分不同的方法?有一个methodID,但递归调用呢?打开后方法何时关闭?
我应该比较堆栈跟踪吗?什么是有意义的数据结构来跟踪输入的方法?就像是Map<StackTrace,Time>?
任何人都可以向我解释为什么我可以在jvm分配一些java对象时获得回调,而不是其他的?这是我在做的事情:
static jvmtiCapabilities capa;
static jvmtiEnv* jvmti = NULL;
static const char* fileName = "C:\\temp\\ObjectInitCallbackDump.txt";
static ofstream outFileStream;
void JNICALL callbackObjectAllocation ( jvmtiEnv* jvmti_env,
JNIEnv* jni_env,
jthread thread,
jobject object,
jclass object_klass,
jlong size )
{
char* generic_ptr_class;
char* class_name;
jvmtiError error;
error = jvmti_env->GetClassSignature(object_klass, &class_name, &generic_ptr_class);
if (check_jvmti_error(jvmti_env, error, "Failed to get class signature")) {
return;
}
outFileStream << class_name << std::endl;
}
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) {
jint result;
jvmtiError error;
jvmtiEventCallbacks callbacks; …
Run Code Online (Sandbox Code Playgroud) 我真的很想知道如何捕捉 JIT 的去优化事件。
今天,我读到了 Andrei Pangin 的精彩回答当忙碌的 Java 线程绑定到物理核心时,是否会因为到达代码中的新分支而发生上下文切换?并再次考虑。
我想用 JNI+JVMTI 捕捉 JIT 的去优化事件,如“unstable_if、class_check 等”,然后向我的监控系统或其他任何东西发送警报。
是否可以?它对 JVM 的性能有什么影响?
I wrote an agent for Java which does nothing just exports two methods, just to check if it loaded on JVM start or not. Built it with mingw-w64 4.8.4 (using JetBrains CLion). Windows 7 x64.
JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM *jvm, char *options, void *reserved){
return JNI_OK;
}
JNIEXPORT void JNICALL
Agent_OnUnload(JavaVM *vm){}
Run Code Online (Sandbox Code Playgroud)
Got an error running
java -agentlib:"C:\JMVAgent\agent.dll"
Error occurred during initialization of VM
Could not find agent library libSampleAgent.dll on the library path,
with error: Can't find dependent libraries …
Run Code Online (Sandbox Code Playgroud) 根据OpenJDK 的网站,可以将线程附加到 Hotspot(动态附加 API),该线程可以收集有关它的信息。我在互联网上找不到任何关于如何获取有关 Hotspot 内部数据结构的信息,例如操作数堆栈或字节码解释器的状态(以了解当前正在执行哪个字节码)或检索当前堆栈帧等的材料。
另外,如果动态连接 API 无法实现这一点,那么如何使用可服务性代理来完成此操作?我在互联网上找到的唯一示例是来自 Github 的要点,它展示了如何附加到正在运行的 JVM 并获取某些字段的值。那么如何访问JVM中的上述内部数据结构呢?