我已经创建了一个java代理jar文件(它在命令行上工作得很好)。接下来,我想将该代理附加到j2ee服务器中正在运行的JVM上。所以我用了密码:
public static void loadAgent() {
System.out.println("dynamically loading javaagent");
String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
int p = nameOfRunningVM.indexOf('@');
String pid = nameOfRunningVM.substring(0, p);
try {
VirtualMachine vm = VirtualMachine.attach(pid);
String jarFilePath = vm.getSystemProperties().getProperty("java.home")+File.separator+"lib"+File.separator+"test-agent-7.jar";
vm.loadAgent(jarFilePath, "");
vm.detach();
} catch (Exception e) {
throw new RuntimeException(e);
}
}编辑:这是现在的工作,我可以看到变压器被调用。我也可以移除变压器和能够调试变压器。
我的问题是:
发布于 2013-12-12 13:26:10
嗯,有几件事要考虑:
如果加载代理,则加载类。只要相关的类加载器在Java的内存中,关联的类就会保持加载。我不认为你能轻易地阻止/规避这件事。但是,这应该只是一个小的内存开销,您可以通过加载代理来激发它。
一些研究表明,代理将由SystemClassLoader加载,因此卸载这些类是不可能的。
VM启动后启动代理 实现可能提供一种机制,用于在VM启动后的某个时候启动代理。关于如何启动的详细信息是特定于实现的,但通常应用程序已经启动,并且已经调用了它的主要方法。在实现支持VM启动后启动代理的情况下,应用如下:代理JAR的清单必须包含属性Agent-Class。此属性的值是代理类的名称。代理类必须实现公共静态agentmain方法。系统类加载器( ClassLoader.getSystemClassLoader)必须支持将代理JAR文件添加到系统类路径的机制。链接到源
然而,你能影响到的是代理人正在做的事情。
你想关掉那个探员吗?提供关闭方法。
如果要从外部停止代理,此代理可以提供一个关闭代理的JMXBean。
然后,该方法可以将转换器从仪表接口中移除,或者停止代理在Java中执行的其他任何操作(释放保存的引用/资源,以便垃圾收集对象,类似于以下内容)。
如果没有更具体地说明你想要实现什么,就很难给出一个更合适的答案。
https://stackoverflow.com/questions/18057504
复制相似问题