
JVMM (JVM Monitor) ist ein Tool, das eine Service-basierte Überwachung von Java-virtuellen Maschinen und Betriebssystemen bietet. It has rich data acquisition functions: OS (memory, CPU, disk status and IO, network card status and IO, etc.), JVM (memory, thread, thread pool, memory pool, GC, class loader, etc.), and also provides functions such as generating flame diagrams, hot updates of Java code, decompilation, etc. Suitable for use in scenarios such as service health monitoring, program tuning, problem investigation, performance testing, usw.
Bitte gehen Sie zu Veröffentlichungen, um die neueste Version von JVMM herunterzuladen und sie zu entpacken
Tipps: Einige Funktionen von JVMM hängen von JDK in der lokalen Umgebung ab. Bitte stellen Sie sicher, dass Sie JDK anstelle von JRE in Ihrer Umgebung installieren. Einfache Überprüfung: Führen Sie
jps -lin Ihrer Umgebung aus. Wenn es normal ausgeführt werden kann und das Ergebnis ausgibt, bedeutet dies, dass die Umgebung in Ordnung ist, da JVMM möglicherweise nicht ausgeführt wird.
Führen Sie zunächst den folgenden Befehl aus, um das Service -JAR -Paket zu generieren
java -jar jvmm.jar -m jar -sStarten Sie dann den Server, achten Sie bitte auf Ihre JDK -Version, wenn Sie beginnen
# 启动server,jdk 8使用下面命令
java -jar jvmm-server.jar
# jdk 9+ 为确保成功运行建议使用下面命令
java -jar --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
jvmm-server.jarWenn der JVMM -Server erfolgreich gestartet wird, wird er standardmäßig auf Port 5010 ausgeführt. Anschließend müssen Sie ein neues Fenster im aktuellen Verzeichnis einrichten, um auszuführen:
java -jar jvmm.jar -m client -a 127.0.0.1:5010 Wenn die Serververbindung erfolgreich ist, geben Sie den Client -Modus ein. Sie können den folgenden Befehl eingeben, um Prozessdaten zu erfassen. Natürlich können Sie help eingeben, um die Verwendung aller ausführbaren Anweisungen in diesem Modus anzuzeigen.
info -t processHier sind Beispiele für Daten, die im JVMM -Client -Modus gesammelt wurden. Die von JVMM bereitgestellten Funktionen sind viel mehr als das. Weitere Funktionen finden Sie in der JVMM -Nutzungsdokumentation.
Die Kernfunktion von JVMM befindet sich im core und die serviceorientierte Funktion befindet sich im server . Nach Ihrem Nutzungsszenario können Sie die folgenden zwei Nutzungsmethoden auswählen:
core (mehr Funktionen) Zunächst müssen Sie verstehen, was Server tun kann? Der Server bietet drei Servicemodi. Vor der Verwendung müssen Sie vor dem Verwenden Sie auswählen, was Sie auswählen müssen. Hier sind die drei Servicemodi:
Jeder Servicemodus ist untrennbar mit der Konfigurationsdatei JVMM.Yyml verbunden. server.type wird verwendet, um zu konfigurieren, welchen Modus oder welchen Modus Sie auswählen. Sie können gleichzeitig laufen . Die spezifischen Konfigurationen jedes Modus entsprechen server.jvmm , server.http und server.sentinel .
server :
type : jvmm,http,sentinel # 支持同时开启多种模式
jvmm :
# ...
http :
# ...
sentinel :
# ...Für die Standardkonfiguration siehe JVMM.YML und für die Konfigurationsinformationen die Kommentare in der Konfigurationsdatei.
JVMM bietet vier Möglichkeiten, um Ihren Server zu starten:
-javaagent -Parameter).jvmm-server.jar direkt (Dekompilierung und Code Hot Update-Funktionen unterstützen nicht)Beachten! ! !
Unabhängig davon, in welcher Art und Weise Sie den Server starten, wird empfohlen, die folgenden JVM -Parameter beim Start hinzuzufügen, um einen erfolgreichen Betrieb zu gewährleisten.
--add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
Führen Sie JVMM.jar aus und wählen Sie den Anhang -Modus aus
java -jar jvmm.jar -m attach -c ./jvmm.ymlAnschließend werden Sie aufgefordert, die Nummer des Zielvorgangs auszuwählen. Nach der Auswahl wird der Server im Zielprozess gestartet.
Wenn Sie die PID des Zielvorgangs bereits kennen, können Sie diese direkt angeben:
java -jar jvmm.jar -m attach -c ./jvmm.yml -pid 80080
In der Java Agent -Methode müssen Sie das erforderliche JAR -Paket erstellen und den Parameter -a verwenden, um den agent anzugeben:
# 如果你的宿主程序中包含了 SLF4J 的实现(例如 logback),需要在生成时使用 -e 参数排除掉jvmm自带的 slf4j 实现
java -jar jvmm.jar -m jar -a -e logger
# 如果你的宿主程序中没有 SLF4J 的实现,无需排除 logger
java -jar jvmm.jar -m jar -a Nach der Ausführung wird die entsprechende Datei in demselben Ebenenverzeichnis generiert: jvmm-agent.jar , und dann wird -javaagent beim Starten des Zielprogramms hinzugefügt (vorausgesetzt, es handelt sich um App.jar). Das Format lautet wie folgt:
java -javaagent:<jvmm-agent.jar路径>=config=<jvmm.yml路径> -jar your-app.jar
Zum Beispiel:
java -javaagent:/path/jvmm-agent.jar=config=/path/jvmm.yml -jar app.jarUm mit der Funktionalität der Verwendung externer Server kompatibel zu sein, lautet das vollständige Javaagent -Format:
-javaagent:<jvmm-agent.jar路径>=server=<jvmm-server.jar路径>;config=<jvmm.yml路径>
Wenn Ihr Programm beginnt, beginnt JVMM als Agent

Wenn Sie keinem Host -Programm beigefügt werden möchten, können Sie einen JVMM -Server separat starten, z. B. im Szenario der Überwachung einer physischen Maschine.
Zunächst müssen Sie die gestartete Jar -Abhängigkeit generieren und den Parameter -s verwenden, um den server anzugeben:
java -jar jvmm.jar -s Nach Abschluss der Ausführung wird ein jvmm-server.jar im selben Verzeichnis generiert, und dann wird der Server gestartet. Bitte achten Sie auf Ihre JDK -Version, wenn Sie anfangen.
# 启动server,jdk 8使用下面命令
java -jar jvmm-server.jar
# jdk 9+ 为确保成功运行建议使用下面命令
java -jar --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
jvmm-server.jarWenn Sie den Server in Ihrem Projekt verwenden möchten, müssen Sie zuerst Maven -Abhängigkeiten vorstellen
< dependencies >
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-server</ artifactId >
< version >${jvmm-version}</ version >
</ dependency >
<!-- jvmm日志依赖,如果你的项目中有 SLF4J、Log4J2、Log4J中任意一个依赖,可以去掉此依赖 -->
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-logger</ artifactId >
< version >${jvmm-version}</ version >
</ dependency >
</ dependencies >Starten Sie den Server mit einer Codezeile
import org . beifengtz . jvmm . server . ServerBootstrap ;
public class Jvmm {
public static void main ( String [] args ) {
ServerBootstrap . getInstance (). start ();
}
} Natürlich verwendet die obige Startmethode die Standardkonfiguration und erfordert im Allgemeinen eine benutzerdefinierte Konfiguration. getInstance -Methode kann in ein org.beifengtz.jvmm.server.entity.conf.Configuration -Objekt übergeben. Benutzerdefinierte Konfiguration kann durch Erstellung der Konfiguration implementiert werden.
Schließen Sie JVMM ServerconveyDemo.java mit JVMMConnector an
Wenn der Server im jvmm oder http -Modus gestartet wird, können Sie die integrierte Schnittstelle remote aufrufen.

Der JVMM -Service bietet die folgenden API -Schnittstellen:
| Typ | Daten | Beschreibung |
|---|---|---|
| JVMM_COLLECT_SYS_INFO | / | Sammeln Sie Informationen zum Betriebssystem |
| JVMM_COLLECT_SYS_MEMORY_INFO | / | Sammeln Sie Betriebssystemspeicherdaten |
| JVMM_COLLECT_SYS_FILE_INFO | / | Erfassen Sie die Nutzungsdaten für Betriebssystem -Festplatten -Partition |
| JVMM_COLLECT_PROCESS_INFO | / | Sammeln Sie aktuelle Prozessdaten |
| JVMM_COLLECT_DISK_INFO | / | Sammeln Sie Daten mit physischen Maschinenplattendaten |
| Jvmm_collect_disk_io_info | / | Sammeln Sie die Datenträger- und Durchsatzdaten der physischen Maschine |
| JVMM_COLLECT_CPU_INFO | / | Sammeln Sie CPU -Lastdaten der physischen Maschine |
| JVMM_COLLECT_NETWORK_INFO | / | Sammeln Sie Informationen zur physischen Maschinenetzwerkkarteninformationen und IO -Daten |
| JVMM_COLLECT_PORT_STATUS | JsonArray, dessen Element die Portnummer ist | Sammeln |
| Jvmm_collect_jvm_classloading_info | / | Sammeln Sie die Ladungsinformationen der JVM -Klasse |
| Jvmm_collect_jvm_classloader_info | / | Sammeln Sie die Laderinformationen der JVM -Klasse |
| JVMM_COLLECT_JVM_COMPILATION_INFO | / | Sammeln Sie JVM -Kompilierungsinformationen |
| JVMM_COLLECT_JVM_GC_INFO | / | Sammeln Sie Informationen über JVM -Müllsammler |
| JVMM_COLLECT_JVM_MEMORY_MANAGER_INFO | / | Sammeln Sie Informationen zum JVM Memory Manager -Informationen |
| JVMM_COLLECT_JVM_MEMORY_POOL_INFO | / | Sammeln Sie JVM -Speicherpool -Informationen |
| JVMM_COLLECT_JVM_MEMORY_INFO | / | Sammeln Sie die Verwendung von JVM -Speicher |
| Jvmm_collect_jvm_thread_info | / | Sammeln Sie JVM -Thread -Statistiken |
| Jvmm_collect_jvm_thread_stack | Siehe ThreadInfodto | Sammeln Sie die angegebenen JVM -Thread -Stapeldaten |
| Jvmm_collect_jvm_thread_detail | JsonArray, dessen Element Thread ID ist | Sammeln Sie JVM -Threaddetails (CPU -Zeit, Blockzeit, Sperren usw.) |
| Jvmm_collect_jvm_thread_pool | JsonObject, seine Eigenschaften sind: ClassloaderHash (String), Clazz (String), InstanceField (String), Feld (String) | Sammeln Sie JVM -Thread -Pool -Informationen |
| Jvmm_collect_jvm_thread_ordered_cpu_time | JsonObject, seine Eigenschaften sind: Typ (String, Stapel | Info), Durationssekunden (int) | Erwerb der CPU -Verwendung in JVM -Threads innerhalb einer bestimmten Zeit |
| JVMM_COLLECT_JVM_DUMP_Thread | / | Dumpeln Sie alle Thread -Stapeldaten |
| JVMM_COLLECT_BATCH | CollectionType [] | Datenerfassung in Chargen basierend auf Optionen |
| JVMM_EXECUTE_GC | / | GC ausführen |
| Jvmm_execute_java_process | / | Listen Sie alle Java -Prozesse auf |
| Jvmm_execute_jvm_tool | Saite | Führen Sie den Befehl JVM Tool aus |
| JVMM_EXECUTE_JAD | JsonObject, seine Eigenschaften sind: className (String), methodName (String) | Code -Dekompilierung (nur Agenten werden unterstützt) |
| JVMM_EXECUTE_LOAD_PATCH | JsonArray, dessen Element Patchdto ist | Code heiße Updates. Bei der Angabe des Hash of Classloaders sind es nur heiße Updates für die Änderung der vom Classloader geladenen Klasse. |
| Jvmm_execute_switches_get | / | Holen Sie sich die Informationen zur Akquisitionschalter |
| Jvmm_execute_switches_set | JsonObject, seine Eigenschaften sind: Namen (Switches []), Open (boolean) | Richten Sie den Akquisitionsschalter ein |
| JVMM_PROFILER_Sample | Siehe Profilersamtto | Flammenkarte generieren |
| JVMM_PROFILER_EXECUTE | Saite | Führen Sie den Profiler-Befehl aus, siehe Async-Profiler |
| JVMM_PROFILER_START | Siehe ProfilerSAMPLEDTO, wobei nur eventcounterinteval gültig ist | Führen Sie den Profiler -Start -Sample -Befehl aus |
| JVMM_PROFILER_STOP | String, Formatfeld in ProfilersampledTo, optionaler Wert ist htmltxtjfr | Führen Sie den Profiler aus, um den Befehl sample- und Exportdatei zu beenden |
| JVMM_PROFILER_STATUS | / | Erhalten Sie den aktuellen Profilerstatus |
| JVMM_PROFILER_LIST_EVENTS | / | Lassen Sie die Profiler -Ereignisse von der aktuellen Umgebung unterstützt |
| JVMM_SERVER_SHUTDOWN | Saite | Schließen Sie den Dienst, Daten sind der Service -Typ |

Der HTTP -Service bietet die folgenden API -Schnittstellen:
| Uri | Verfahren | Parameter | Körper | beschreiben |
|---|---|---|---|---|
| /sammeln/verarbeiten | ERHALTEN | / | / | Prozessinformationen sammeln |
| /sammeln/disk | ERHALTEN | / | / | Sammeln Sie Daten mit physischen Maschinenplattendaten |
| /sammeln/disk_io | ERHALTEN | / | / | Sammeln Sie die Datenträger- und Durchsatzdaten der physischen Maschine |
| /sammeln/cpu | ERHALTEN | / | / | Sammeln Sie CPU -Lastdaten der physischen Maschine |
| /Sammeln/Netzwerk | ERHALTEN | / | / | Sammeln Sie Informationen zur physischen Maschinenetzwerkkarteninformationen und IO -Daten |
| /sammeln/sys | ERHALTEN | / | / | Sammeln Sie Informationen zum Betriebssystem |
| /sammeln/sys/memor | ERHALTEN | / | / | Sammeln Sie Betriebssystemspeicherdaten |
| /sammeln/sys/Datei | ERHALTEN | / | / | Erfassen Sie die Nutzungsdaten für Betriebssystem -Festplatten -Partition |
| /sammeln/port | ERHALTEN | Ports (int []) | / | Erwerb des Betriebsanschlusss des Betriebssystems |
| /sammeln/jvm/klassenloading | ERHALTEN | / | / | Sammeln Sie die Ladungsinformationen der JVM -Klasse |
| /sammeln/jvm/classloader | ERHALTEN | / | / | Sammeln Sie die Laderinformationen der JVM -Klasse |
| /sammeln/JVM/Zusammenstellung | ERHALTEN | / | / | Sammeln Sie JVM -Kompilierungsinformationen |
| /sammeln/jvm/gc | ERHALTEN | / | / | Sammeln Sie Informationen über JVM -Müllsammler |
| /sammeln/jvm/mes MEAME_MANAGER | ERHALTEN | / | / | Sammeln Sie Informationen zum JVM Memory Manager -Informationen |
| /sammeln/jvm/major_pool | ERHALTEN | / | / | Sammeln Sie JVM -Speicherpool -Informationen |
| /sammeln/JVM/Speicher | ERHALTEN | / | / | Sammeln Sie die Verwendung von JVM -Speicher |
| /sammeln/jvm/thread | ERHALTEN | / | / | Sammeln Sie JVM -Thread -Statistiken |
| /sammeln/jvm/thread_stack | POST | / | Siehe ThreadInfodto | Sammeln Sie die angegebenen JVM -Thread -Stapeldaten |
| /sammeln/jvm/Dump_Thread | ERHALTEN | / | / | Dumpeln Sie alle Thread -Stapeldaten |
| /sammeln/jvm/thread_ordered_cpu_time | ERHALTEN | Typ (String, Stack | Info), Durationssekunden (int) | / | Erwerb der CPU -Verwendung in JVM -Threads innerhalb einer bestimmten Zeit |
| /sammeln/jvm/thread_detail | ERHALTEN | id (lang []) | / | Sammeln Sie JVM -Threaddetails (CPU -Zeit, Blockzeit, Sperren usw.) |
| /sammeln/jvm/thread_pool | ERHALTEN | classloaderHash (String), Clazz (String), InstanceField (String), Feld (String) | / | Sammeln Sie JVM -Thread -Pool -Informationen |
| /sammeln/by_options | ERHALTEN | Optionen (Sammlungstyp []) | Datenerfassung in Chargen basierend auf Optionen | |
| /ausführen/gc | ERHALTEN | / | / | GC ausführen |
| /ausführen/jps | ERHALTEN | / | / | Listen Sie alle Java -Prozesse auf |
| /execute/jvm_tool | POST | / | Befehl (Zeichenfolge) | Führen Sie den Befehl JVM Tool aus |
| /ausführen/jad | ERHALTEN | className (String), methodName (String) | / | Code -Dekompilierung (nur Agenten werden unterstützt) |
| /ausführen/load_patch | POST | / | JsonArray, dessen Element Patchdto ist | Code heiße Updates. Bei der Angabe des Hash of Classloaders sind es nur heiße Updates für die Änderung der vom Classloader geladenen Klasse. |
| /Ausführen/get_switches | ERHALTEN | / | / | Holen Sie sich die Informationen zur Akquisitionschalter |
| /execute/set_switches | ERHALTEN | Namen (Switches []), Open (boolean) | / | Richten Sie den Akquisitionsschalter ein |
| /Profiler/flame_graph | POST | / | Siehe Profilersamtto | Flammenkarte generieren |
| /Profiler/Start | POST | / | Siehe ProfilerSAMPLEDTO, wobei nur eventcounterinteval gültig ist | Führen Sie den Profiler -Start -Sample -Befehl aus |
| /Profiler/Stopp | POST | / | String, Formatfeld in ProfilersampledTo, optionaler Wert ist htmltxtjfr | Führen Sie den Profiler aus, um den Befehl sample- und Exportdatei zu beenden |
| /Profiler/Status | ERHALTEN | / | / | Erhalten Sie den aktuellen Profilerstatus |
| /Profiler/list_events | ERHALTEN | / | / | Lassen Sie die Profiler -Ereignisse von der aktuellen Umgebung unterstützt |
| /Profiler/Ausführen | POST | / | Befehl (Zeichenfolge) | Führen Sie den Profiler-Befehl aus, siehe Async-Profiler |
| /Server/Herunterfahren | ERHALTEN | Ziel (Zeichenfolge) | / | Schließen Sie den Dienst, Daten sind der Service -Typ |

Die Betriebslogik des Sentinel -Modus besteht darin, bestimmte Datenelemente regelmäßig zu sammeln und anschließend an Abonnenten zu treiben . Sie müssen einen Abonnementdienst (HTTP -Schnittstelle) anbieten, der Daten empfangen kann. Wenn der Schnittstellenzugriff die Identitätsauthentifizierung erfordert, unterstützt die Abonnenten -HTTP -Schnittstelle derzeit nur die grundlegende Authentifizierung.
Konfiguration des Sentinel -Modus
server :
type : sentinel
sentinel :
- subscribers :
# publish jvmm data to custom http server
- type : http
url : http://127.0.0.1:9999/monitor/subscriber
auth :
enable : true
username : 123456
password : 123456
# publish jvmm data to prometheus
- type : prometheus
url : http://127.0.0.1:9090/api/v1/write
auth :
enable : true
username : 123456
password : 123456
interval : 15
tasks :
- process
- disk
- disk_io
- cpu
- port
...Insgesamt werden die folgenden Sammlungsgegenstände unterstützt:
[
" process " ,
" disk " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file " ,
" port " ,
" jvm_classloading " ,
" jvm_classloader " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_manager " ,
" jvm_memory_pool " ,
" jvm_thread " ,
" jvm_thread_stack " ,
" jvm_thread_detail " ,
" jvmm_thread_pool "
]Derzeit unterstützen nur die folgenden Sammlungselemente Prometheus
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]JVMM bietet zwei Dashboards von Grafana Template, nämlich: Knoten und JVM
Die Knotenvorlage ist eine Sammlung systembezogener Überwachungselemente, mit denen Sie sich mehr auf die Überwachung von Daten von physischen Maschinen oder Cloud-Hosts konzentrieren können.


Methode importieren: Die Dashboard-ID 20430 importieren oder Dashboard-Node.json importieren
Um mit dieser Vorlage zusammenzuarbeiten, müssen die folgenden Aufgaben konfiguriert werden:
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file "
]Die JVM- Vorlage ist eine Sammlung von JVM-bezogenen Überwachungselementen, mit denen Sie sich mehr auf die Überwachungsdaten des Prozesses konzentrieren können.


Methode importieren: Dashboard ID 20429 oder Dashboard-Jvm.json importieren
Um mit dieser Vorlage zusammenzuarbeiten, müssen die folgenden Aufgaben konfiguriert werden:
[
" process " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]Wenn Sie nach JVMM sekundär entwickeln möchten, müssen Sie nur Kernabhängigkeiten einführen
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-core</ artifactId >
< version >${jvmm-version}</ version >
</ dependency > Alle Funktionen für die Datenerfassung, die vom vorherigen Server bereitgestellt werden, und andere funktionale Schnittstellen, die keine Remote -Aufruf -Schnittstellen anbieten org.beifengtz.jvmm.core.JvmmFactory können über eine Fabrikklasse erhalten werden
public class Jvmm {
public static void main ( String [] args ) {
// 提供所有的数据采集接口
JvmmCollector collector = JvmmFactory . getCollector ();
// 提供所有的执行接口
JvmmExecutor executor = JvmmFactory . getExecutor ();
// 提供火焰图生成器
JvmmProfiler profiler = JvmmFactory . getProfiler ();
}
}Das JVMM -Client -Tool bietet einen einfachen und schnellen Weg, um JVMM remote aufzurufen. Natürlich übernimmt es auch wichtige Funktionen wie den Anhängen von Server und das Generieren von Abhängigkeitsgläser.
Das Client -Tool bietet eine Bootstrap -Befehlsausführungsfunktion und wird auch dann ausgeführt, wenn Sie keine Parameter einnehmen. Für eine bestimmte Verwendung verwenden Sie bitte den folgenden Befehl, um das Hilfsdokument anzuzeigen:
java -jar jvmm.jar -hBeispiel für die Datenerfassung nach Client -Tool
Generieren Sie das Flammendiagrammbeispiel

CODE -CALL -Beispiel
Beispiel für benutzerdefinierte Dashboard -Anwendung

Einige Komponenten im Projekt können ohne das Projekt verwendet werden, leicht und einfach zu bedienen
Der Grund dafür ist, dass in Ihrer Umgebung keine JDK -Tools oder Umgebungsvariablen nicht konfiguriert sind. Bitte stellen Sie sicher, dass Ihre Umgebung mit JDK anstelle von JRE installiert ist. Einfache Überprüfung: Führen Sie jps -l in Ihrer Umgebung aus, und wenn es normal ausgeführt werden kann und das Ergebnis ausgeben kann, bedeutet dies, dass die Umgebung in Ordnung ist.
Lösung: Konfigurieren Sie Ihr lokales JDK bin -Verzeichnis als Umgebungsvariable
Wenn Sie mit jvmm-server.jar beginnen, ist der Grund, dass Sie JDK 9 und höher verwenden, Java verbietet den reflektierenden Zugriff auf einige Klassen, beginnend mit JDK 9+.
java.lang.reflect.InaccessibleObjectException: Unable to make field final jdk.internal.loader.URLClassPath jdk.internal.loader.ClassLoaders$AppClassLoader.ucp accessible: module java.base does not "opens jdk.internal.loader" to unnamed module @2d127a61
Lösung: Fügen Sie die folgenden Parameter der virtuellen Maschine hinzu
# JDK 9+ 为确保成功运行建议设置以下几个虚拟机参数
# --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
# --add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
# --add-opens java.base/java.net=ALL-UNNAMED
# --add-opens java.management/sun.management=ALL-UNNAMED
java -jar --add-opens java.base/jdk.internal.loader=ALL-UNNAMED
--add-opens jdk.zipfs/jdk.nio.zipfs=ALL-UNNAMED
--add-opens java.base/java.net=ALL-UNNAMED
--add-opens java.management/sun.management=ALL-UNNAMED
jvmm-server.jar ./jvmm.yml Wenn Sie No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1' , der Grund dafür ist, dass das Systemkernel die Erkennung der Systemleistung standardmäßig verbietet, und Sie müssen diese Option aktivieren.
sudo systcl -w kernel.perf_event_paranoid=1Oder ändern Sie die SYSCTL -Datei
sudo sh -c ' echo "kernel.perf_event_paranoid=1" >> /etc/sysctl.conf '
sudo sysctl -pDieses Tool ist vollständig Open Source und kostenlos und es ist nicht einfach zu erstellen. Wenn Sie der Meinung sind, dass es gut ist, können Sie spenden, um dieses Projekt zu unterstützen.
Spendenliste:
Wenn Sie beim Gebrauch Probleme stoßen oder einzigartige Erkenntnisse oder Vorschläge zu diesem Projekt haben, senden Sie mir bitte ein Problem oder senden Sie mir eine private Nachricht
E -Mail: [email protected]
WeChat: Beifeng-TZ (Bitte beachten Sie JVMM , wenn Sie es hinzufügen)