Kan en JVM hente en liste over agenter, der er blevet indlæst i den via det vedhæftede api?
(Dette spørgsmål ligner Hvordan finder man en liste over java-agenter knyttet til en kørende JVM?. For fuldstændighedens skyld vil jeg tilføje dette svar til begge spørgsmål.)
Kontrol af agenter, der er blevet tilføjet ved hjælp af Attach API:
Hvis du er interesseret i de agenter, der er blevet tilføjet til en applikation under kørsel ved hjælp af Attach API, kan du bruge DiagnosticCommandMBean
.Denne bean tilbyder en diagnostisk kommando kaldet vmDynlib
, en parameterløs metode, der returnerer en String
som viser alle dynamisk indlæste biblioteker.
Her er et uddrag, der udskriver alle dynamiske biblioteker indlæst af applikationens 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);
Dette resulterer i et output svarende til dette:
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
...
Du kan derefter kontrollere denne tekst, hvis den indeholder en bestemt .so
eller .dll
fil.
Den samme inspektion kan udføres ikke-programmatisk.
Til dette kan du bruge jconsole
værktøj.
Opret forbindelse til en VM, skift til fanen MBeans
, vælg com.sun.management
, vælg DiagnosticCommand
, vælg Operations
, vælg vmDynlibs
, og påkald det.
På billedet kan du se en af mine testagenter knyttet til applikationen. Agenten blev knyttet ved hjælp af Attach API
, så denne agent ville ikke være synlig ved at kontrollere applikationens kommandolinjeargumenter (dvs. ingen -agentpath=...
vil blive set på argumenterne), men er kun synlig som et dynamisk indlæst bibliotek.
Kontrol af agenter, der er blevet tilføjet via kommandolinje:
For at få den komplette reference vil jeg også skrive, hvordan man finder agenter, der er blevet tilføjet via kommandolinjen. Du kan kontrollere dem ved at bruge RuntimeMXBean
.
Denne bønne tilbyder metoden getInputArguments
, som returnerer en liste over alle VM-argumenter. Du kan iterere over listen og kontrollere den for argumenterne agentpath
, agentlib
og javaagent
, svarende til følgende kodestykke:
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();
}
}