是否有可能通过 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
,并调用它。
在图像中,您可以看到我的一个测试代理附加到应用程序。
使用 Attach API
附加代理,因此通过检查应用程序的命令行参数(即,不会在参数上看到 -agentpath=...
),此代理将不可见,但仅作为动态加载的库可见。
检查通过命令行添加的代理:
为了获得完整的引用,我还将发布如何检测已通过命令行添加的代理。
您可以使用 RuntimeMXBean
检查它们.
此 bean 提供方法 getInputArguments
,它返回所有 VM 参数的列表。
您可以遍历列表并检查参数 agentpath
、agentlib
和 javaagent
,类似于以下代码片段:
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/