(这个问题类似于如何查找正在运行的 JVM 附带的 java 代理列表? https://stackoverflow.com/q/28670271/2938364。为了完整起见,我将在这两个问题中添加这个答案。)
检查已使用 Attach API 添加的代理:
如果您对使用 Attach API 在运行时添加到应用程序的代理感兴趣,您可以使用DiagnosticCommandMBean https://docs.oracle.com/javase/8/docs/jre/api/management/extension/com/sun/management/DiagnosticCommandMBean.html。
该 bean 提供了一个称为vmDynlib
,一个无参数方法,返回一个String
列出所有动态加载的库。
以下是打印应用程序虚拟机加载的所有动态库的代码片段:
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
or .dll
file.
可以非编程方式执行相同的检查。
为此,您可以使用jconsole https://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html tool.
连接到虚拟机,切换到选项卡MBeans
, 选择com.sun.management
, 选择DiagnosticCommand
, 选择Operations
, 选择vmDynlibs
,并调用它。
在图像中,您可以看到我的测试代理之一附加到应用程序。
该代理是使用Attach API https://docs.oracle.com/javase/7/docs/jdk/api/attach/spec/com/sun/tools/attach/VirtualMachine.html,因此通过检查应用程序的命令行参数(即,没有-agentpath=...
将在参数上看到),但仅作为动态加载的库可见。
检查已通过命令行添加的代理:
为了获得完整的参考,我还将发布如何检测通过命令行添加的代理。
您可以使用以下命令检查它们RuntimeMXBean https://docs.oracle.com/javase/7/docs/api/java/lang/management/RuntimeMXBean.html.
这个bean提供了方法getInputArguments
,它返回所有 VM 参数的列表。
您可以迭代列表并检查参数agentpath
, agentlib
and 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();
}
}