我想知道如何使用AttachAPI与我附加在运行的JVM上的jvmti代理进行通信。当我说Communication时,我的意思是:我想调用位于我的jvmti代理上的本机函数,这些函数将向我返回我先前通过代理“感染”的正在运行的JVM的数据(如字段值)。
#include <jvmti.h>
JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved);
jvmtiEnv* create_jvmti_env(JavaVM* vm);
JNIEnv* create_jni_env(JavaVM* vm);
void init_jvmti_capabilities(jvmtiEnv* env);
JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved) {
jvmtiEnv* jvmti = create_jvmti_env(vm);
init_jvmti_capabilities(jvmti);
JNIEnv* jni = create_jni_env(vm);
return JNI_OK;
}
jvmtiEnv* create_jvmti_env(JavaVM* vm) {
jvmtiEnv* env;
vm->GetEnv((void **) &env, JVMTI_VERSION_1_2);
return env;
}
JNIEnv* create_jni_env(JavaVM* vm) {
JNIEnv* env;
vm->GetEnv( (void **) &env, JNI_VERSION_1_8);
return env;
}
void init_jvmti_capabilities(jvmtiEnv* env) {
jvmtiCapabilities capabilities;
env->GetPotentialCapabilities( &capabilities);
env->AddCapabilities( &capabilities);
}
如何使用附加API与在运行的JVM上附加的jvmti代理通信。
如果我正确理解了您在这里所做的事情,那么您的外部应用程序如何与代理通信完全取决于您,但实现它也取决于您...从设计或选择您将要使用的wire-protocol开始。
JVMTI代理通常需要遍历Java堆并精确访问每个活动对象一次。一种技术是调用FollowReferences并通过以下方法避免多次遍历给定对象: null
问题内容: 我正在使用Attach API在运行时加载JVMTI代理。我想在完成程序后卸载JVMTI代理,而不会终止加载该代理的JVM。根据此文档,无法从Attach API进行此操作。还有其他方法可以强制代理通过Java API或从JVMTI代理内部卸载自身吗? 问题答案: JVMTI 规范说可以卸载(不终止JVM),但是卸载依赖于平台且超出规范范围。
问题内容: 很多时候,Java应用程序需要连接到Internet。最常见的示例是在读取XML文件并需要下载其架构时发生的。 我在代理服务器后面。如何设置我的JVM使用代理? 问题答案: 从Java文档(不是 javadoc API)中: http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html 设置JVM标
为了帮助 Java 开发人员诊断和跟踪 Java 线程状态的切换,Sun 公司在 Java 开发工具包(Java2 Software Development Kit, JDK)1.5.0 版本中引进了 Java 虚拟机工具接口(Java Virtual Machine Toolkit Interface,JVMTI),用于替代在先前的 JDK 版本中作为试验功能存在的 Java 虚拟机剖析接口(J
我试图使用Anylogic Pastern library进行建模,其中一个agent(A)将与另一个agent(B)通信,只有当另一个agent在A的特定视角和弧半径内时。传统的通信方式是定义一定的基于距离的通信,其中定义的距离形成围绕该agent的球体。但我想建模,代理将无法与不在他视野角度内的其他代理通信(像一个圆锥形投影&一定距离)。例如,代理应该无法与身后的其他人进行交流。我怎么能这么做