java - JVM 能否检索已通过附加 api 加载到其中的代理列表?

标签 java jvm javaagents

是否有可能通过 Java 1.6 attach api 获得加载到当前 JVM 的代理列表?如果是怎么办?

启动时加载的代理可以通过 RuntimeMXBean 确定,但我看不到一种方法来处理启动后添加的代理。

最佳答案

(此问题类似于 How to find list of java agents attached with a running JVM?。为了完整起见,我将对这两个问题添加此答案。)


检查使用 Attach API 添加的代理:

如果您对使用 Attach API 在运行时添加到应用程序的代理感兴趣,您可以使用 DiagnosticCommandMBean . 这个 bean 提供了一个名为 vmDynlib 的诊断命令,这是一个无参数的方法,它返回一个列出所有动态加载的库的 String

这是打印应用程序 VM 加载的所有动态库的片段:

ObjectName diagnosticsCommandName = new ObjectName("com.sun.management:type=DiagnosticCommand");
String operationName = "vmDynlibs";
String result = (String) ManagementFactory.getPlatformMBeanServer().invoke(diagnosticsCommandName, operationName, null, null);
System.out.println(result);

这会导致类似于此的输出:

Dynamic libraries:
0x00007ff7b8600000 - 0x00007ff7b8637000     C:\Program Files\Java\jdk1.8.0_181\bin\java.exe
0x00007ffdfeb00000 - 0x00007ffdfecf0000     C:\WINDOWS\SYSTEM32\ntdll.dll
0x00007ffdfe300000 - 0x00007ffdfe3b2000     C:\WINDOWS\System32\KERNEL32.DLL
0x00007ffdfbb30000 - 0x00007ffdfbdd3000     C:\WINDOWS\System32\KERNELBASE.dll
0x00007ffdfe950000 - 0x00007ffdfe9f3000     C:\WINDOWS\System32\ADVAPI32.dll
...

然后您可以检查此文本是否包含某个 .so.dll 文件。


可以非编程方式执行相同的检查。

为此,您可以使用 jconsole工具。

连接到 VM,切换到选项卡 MBean,选择 com.sun.management,选择 DiagnosticCommand,选择 Operations ,选择vmDynlibs,并调用它。

vmDynlibs output

在图像中,您可以看到我的一个测试代理附加到应用程序。 使用 Attach API 附加代理,因此通过检查应用程序的命令行参数(即,不会在参数上看到 -agentpath=...),此代理将不可见,但仅作为动态加载的库可见。

检查通过命令行添加的代理:

为了获得完整的引用,我还将发布如何检测已通过命令行添加的代理。 您可以使用 RuntimeMXBean 检查它们.

此 bean 提供方法 getInputArguments,它返回所有 VM 参数的列表。 您可以遍历列表并检查参数 agentpathagentlibjavaagent,类似于以下代码片段:

    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
    List<String> jvmArgs = runtimeMXBean.getInputArguments();
    System.out.println("JVM arguments:");
    for (String arg : jvmArgs) {
        if (arg.startsWith("-agentpath") || arg.startsWith("-agentlib") || arg.startsWith("-javaagent")) {
            System.out.print("***** ");
        }

        System.out.print(arg);

        if (arg.startsWith("-agentpath") || arg.startsWith("-agentlib") || arg.startsWith("-javaagent")) {
            System.out.println(" *****");
        } else {
            System.out.println();
        }
    }

关于java - JVM 能否检索已通过附加 api 加载到其中的代理列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6904728/

相关文章:

c# - 是 C#'s attributes better designed than Java' 的注释吗?

java - "Variable might not have been initialized"错误

javaagents - 获取所有 JADE 容器的列表

java - 如何从 Java 代理停止/暂停主程序/线程

java - 如何在 Android 上触摸时显示圆圈?

java - PrintReader 返回不可读的字符

java - 如何使用 "-Xlog:heap*=debug" "-Xlog:gc*=debug"从 GC 正确读取日志的某些部分

java - 有没有办法编译隐藏源代码?

java - Java Instrumentation Agent 是否支持类中的新方法定义?

java - apache cxf LoggingFeature 屏蔽敏感信息