Java >> Java tutorial >  >> JVM

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();
        }
    }

Java tag