gpt4 book ai didi

java - 如何找到运行中的 JVM 附带的 Java 代理列表?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:25 25 4
gpt4 key购买 nike

我正在尝试调试添加到生产 JVM 的 Java 代理之一的问题。

在应用程序的启动脚本中正确添加了 java 代理,并且已经在其他环境中工作。但在生产中,这个代理似乎不起作用。

有没有办法找到添加的 java 代理列表?

最佳答案

(此问题类似于 Can a JVM retrieve a list of agents that have been loaded into it via the attach api?)。为了完整起见,我将对这两个问题都添加这个答案。)


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

如果您对使用命令行界面添加的代理感兴趣,可以使用 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();
}
}

检查使用 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=...),此代理将不可见,但仅作为动态加载的库可见。

关于java - 如何找到运行中的 JVM 附带的 Java 代理列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28670271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com