Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不停止JVM的情况下向JVM添加Javaagent?_Java_Jvm_Javaagents - Fatal编程技术网

如何在不停止JVM的情况下向JVM添加Javaagent?

如何在不停止JVM的情况下向JVM添加Javaagent?,java,jvm,javaagents,Java,Jvm,Javaagents,我希望在不停止应用程序的情况下评测Java应用程序。我可以在应用程序运行时以某种方式添加Javaagent吗?根据软件包的文档,这应该是可能的 在VM启动后启动代理程序 一个实现可以提供一种机制来启动代理 在虚拟机启动之后。这个 有关如何启动的详细信息 是具体实现的,但是 通常,应用程序已经 它的主要方法是 已被调用。如果 一个实现支持 在虚拟机启动后启动代理 以下情况适用: 1.代理JAR的清单必须包含该属性 代理类。它的价值是什么 属性是代理的名称 类。 2.代理类必须实现公共静态agent

我希望在不停止应用程序的情况下评测Java应用程序。我可以在应用程序运行时以某种方式添加Javaagent吗?

根据软件包的文档,这应该是可能的

在VM启动后启动代理程序

一个实现可以提供一种机制来启动代理 在虚拟机启动之后。这个 有关如何启动的详细信息 是具体实现的,但是 通常,应用程序已经 它的主要方法是 已被调用。如果 一个实现支持 在虚拟机启动后启动代理 以下情况适用:

1.代理JAR的清单必须包含该属性 代理类。它的价值是什么 属性是代理的名称 类。
2.代理类必须实现公共静态agentmain 方法。
3.系统类加载器(ClassLoader.getSystemClassLoader)必须 支持添加代理的机制 JAR文件到系统类路径


但我从未尝试过:-

根据软件包的文档,这应该是可能的

在VM启动后启动代理程序

一个实现可以提供一种机制来启动代理 在虚拟机启动之后。这个 有关如何启动的详细信息 是具体实现的,但是 通常,应用程序已经 它的主要方法是 已被调用。如果 一个实现支持 在虚拟机启动后启动代理 以下情况适用:

1.代理JAR的清单必须包含该属性 代理类。它的价值是什么 属性是代理的名称 类。
2.代理类必须实现公共静态agentmain 方法。
3.系统类加载器(ClassLoader.getSystemClassLoader)必须 支持添加代理的机制 JAR文件到系统类路径

但我从未尝试过:-

它链接到“运行时动态加载javaagent”下的链接,提供了工作示例:

public static void loadAgent() throws Exception {
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
    String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@'));
    VirtualMachine vm = VirtualMachine.attach(pid);
    vm.loadAgent(jarFilePath, "");
    vm.detach();
}
请注意,Java9要求JVM启动参数中存在
-Djdk.attach.allowAttachSelf=true

请参阅

它链接到“运行时动态加载javaagent”下的链接,提供了工作示例:

public static void loadAgent() throws Exception {
    String nameOfRunningVM = ManagementFactory.getRuntimeMXBean().getName();
    String pid = nameOfRunningVM.substring(0, nameOfRunningVM.indexOf('@'));
    VirtualMachine vm = VirtualMachine.attach(pid);
    vm.loadAgent(jarFilePath, "");
    vm.detach();
}

请注意,Java 9要求JVM启动参数中存在
-Djdk.attach.allowAttachSelf=true

这里有一个库,它通过注入指令插入在运行时初始化aspectj和spring特性:


您可以将其用作一个更详细的示例。

这里有一个库,它通过注入插装在运行时初始化aspectj和spring方面:

您可以将其用作更详细的示例。

您可以使用

使用它,在运行时加载代理将如下所示:

public class HelloAgentWorld
{
    public static class HelloAgent
    {
        public static void agentmain(String agentArgs, Instrumentation inst)
        {
            System.out.println(agentArgs);
            System.out.println("Hi from the agent!");
            System.out.println("I've got instrumentation!: " + inst);
        }
    }

    public static void main(String[] args)
    {
        AgentLoader.loadAgentClass(HelloAgent.class.getName(), "Hello!");
    }
}
你可以用

使用它,在运行时加载代理将如下所示:

public class HelloAgentWorld
{
    public static class HelloAgent
    {
        public static void agentmain(String agentArgs, Instrumentation inst)
        {
            System.out.println(agentArgs);
            System.out.println("Hi from the agent!");
            System.out.println("I've got instrumentation!: " + inst);
        }
    }

    public static void main(String[] args)
    {
        AgentLoader.loadAgentClass(HelloAgent.class.getName(), "Hello!");
    }
}

我希望能够在生产环境中附加调试器的时候…@omerkudat ouchy:)。然后使用调试器选项运行它,您不会看到任何真正的性能缺陷,但是调试器可能会导致泄漏SSO调试器选项是否允许我在运行时添加javaagent?@bestsss:它们也可能是一个安全漏洞。@Software Monkey-几乎没有安全漏洞-在附加调试器之前,阻止端口并仅允许它用于少数选定的IP。我希望可以在制作…@omerkudat ouchy:)。然后使用调试器选项运行它,您不会看到任何真正的性能缺陷,但是调试器可能会导致泄漏SSO调试器选项是否允许我在运行时添加javaagent?@bestsss:它们也可能是一个安全漏洞。@Software Monkey-几乎没有安全漏洞-在连接调试器之前,阻止端口并只允许它用于少数选定的IP。我检查了ea代理加载程序,它看起来很不错。可悲的是,它对我不起作用:在这里,我检查了ea代理加载程序,它看起来相当不错。可悲的是,它对我不起作用:在这里