
JVMM (JVM Monitor) هي أداة توفر المراقبة القائمة على الخدمة لأجهزة Java الظاهرية وأنظمة التشغيل. إنه يحتوي على وظائف الحصول على البيانات الغنية: OS (الذاكرة ، وحدة المعالجة المركزية ، حالة القرص و IO ، حالة بطاقة الشبكة و IO ، إلخ) ، JVM (الذاكرة ، مؤشر الترابط ، تجمع مؤشرات الترابط ، GC ، محمل فئة ، إلخ) ، ويوفر أيضًا وظائف مثل توليد مخططات Flame ، والتحديثات الساخنة من رمز JAVA ، إلخ. إلخ.
يرجى الانتقال إلى الإصدارات لتنزيل أحدث إصدار من JVMM وفك ضغطه
نصائح: بعض وظائف JVMM تعتمد على JDK في البيئة المحلية. يرجى التأكد من تثبيت JDK بدلاً من JRE في بيئتك. التحقق البسيط: قم بتنفيذ
jps -lفي بيئتك. إذا كان من الممكن تنفيذها بشكل طبيعي وإخراج النتيجة ، فهذا يعني أن البيئة على ما يرام ، وإلا فإن JVMM قد لا يكون قادرًا على التشغيل.
أولاً ، قم بتنفيذ الأمر التالي لإنشاء حزمة جرة الخدمة
java -jar jvmm.jar -m jar -sثم ابدأ الخادم ، يرجى الانتباه إلى إصدار JDK الخاص بك عند البدء
# 启动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.jarإذا تم بدء تشغيل خادم JVMM بنجاح ، فسيتم تشغيله على المنفذ 5010 افتراضيًا ، ثم تحتاج إلى إعداد نافذة جديدة في الدليل الحالي لتنفيذ:
java -jar jvmm.jar -m client -a 127.0.0.1:5010 إذا كان اتصال الخادم ناجحًا ، فستدخل وضع العميل. يمكنك إدخال الأمر التالي لجمع بيانات العملية. بالطبع ، يمكنك إدخال help لعرض استخدام جميع التعليمات القابلة للتنفيذ في هذا الوضع.
info -t processفيما يلي أمثلة للبيانات التي تم جمعها في وضع عميل JVMM. الوظائف التي توفرها JVMM أكثر من ذلك بكثير. لمزيد من الوظائف ، يرجى قراءة وثائق استخدام JVMM.
وظيفة الحصول على البيانات الأساسية من JVMM هي في الوحدة core ، والوظيفة الموجهة للخدمة موجودة في وحدة server . وفقًا لسيناريو الاستخدام الخاص بك ، يمكنك اختيار طريقتي الاستخدام التالية:
core (المزيد من الوظائف) بادئ ذي بدء ، تحتاج إلى فهم ما يمكن أن يفعله الخادم؟ يوفر الخادم ثلاث أوضاع خدمة. قبل استخدامه ، أي واحد تحتاج إلى اختياره أكثر ملاءمة لك. فيما يلي أوضاع الخدمة الثلاثة:
أي وضع خدمة لا ينفصل عن ملف التكوين jvmm.yml. يتم استخدام server.type لتكوين الوضع أو الوضع الذي تختاره. يمكن أن تعمل في نفس الوقت . تتوافق التكوينات المحددة لكل وضع مع server.jvmm و server.http و server.sentinel .
server :
type : jvmm,http,sentinel # 支持同时开启多种模式
jvmm :
# ...
http :
# ...
sentinel :
# ...للاطلاع على التكوين الافتراضي ، راجع jvmm.yml ، ولإجراء معلومات التكوين ، راجع التعليقات في ملف التكوين.
يوفر JVMM أربع طرق لبدء الخادم الخاص بك:
-javaagent )jvmm-server.jar مباشرة (لا تدعم وظائف التحديث الساخن والرمز الساخن)يلاحظ! ! !
بغض النظر عن الطريقة التي تبدأ بها الخادم ، إذا كانت بيئة التشغيل الخاصة بك هي JDK 9+ أو أعلى ، فمن المستحسن إضافة معلمات JVM التالية عند بدء التشغيل لضمان التشغيل الناجح.
--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.Jar وحدد وضع الإرفاق
java -jar jvmm.jar -m attach -c ./jvmm.ymlبعد ذلك ، سيُطلب منك تحديد رقم العملية المستهدفة. بعد الاختيار ، سيتم بدء الخادم في العملية المستهدفة.
إذا كنت تعرف بالفعل PID من العملية المستهدفة ، فيمكنك تحديدها مباشرة:
java -jar jvmm.jar -m attach -c ./jvmm.yml -pid 80080
في طريقة Agent Java ، تحتاج إلى إنشاء حزمة JAR المطلوبة واستخدام المعلمة -a لتحديد agent الجيل:
# 如果你的宿主程序中包含了 SLF4J 的实现(例如 logback),需要在生成时使用 -e 参数排除掉jvmm自带的 slf4j 实现
java -jar jvmm.jar -m jar -a -e logger
# 如果你的宿主程序中没有 SLF4J 的实现,无需排除 logger
java -jar jvmm.jar -m jar -a بعد التنفيذ ، سيتم إنشاء الملف المقابل في نفس الدليل: jvmm-agent.jar ، ثم يتم إضافة المعلمة -javaagent عند بدء البرنامج الهدف (على افتراض أنه app.jar). التنسيق كما يلي:
java -javaagent:<jvmm-agent.jar路径>=config=<jvmm.yml路径> -jar your-app.jar
على سبيل المثال:
java -javaagent:/path/jvmm-agent.jar=config=/path/jvmm.yml -jar app.jarلتكون متوافقة مع وظيفة استخدام الخوادم الخارجية ، فإن تنسيق Javaagent الكامل هو:
-javaagent:<jvmm-agent.jar路径>=server=<jvmm-server.jar路径>;config=<jvmm.yml路径>
عندما يبدأ برنامجك ، سيبدأ JVMM كوكيل

إذا كنت لا ترغب في إرفاق أي برنامج مضيف ، فيمكنك اختيار بدء خادم JVMM بشكل منفصل ، كما هو الحال في سيناريو مراقبة الجهاز الفعلي.
أولاً ، تحتاج إلى إنشاء تبعية جرة واستخدام المعلمة -s لتحديد server التوليد:
java -jar jvmm.jar -s بعد الانتهاء من التنفيذ ، سيتم إنشاء jvmm-server.jar في نفس الدليل ، ثم سيتم بدء الخادم. يرجى الانتباه إلى إصدار JDK الخاص بك عند البدء.
# 启动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.jarإذا كنت ترغب في استخدام الخادم في مشروعك ، فأنت بحاجة أولاً إلى تقديم تبعيات Maven
< 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 >بدء الخادم مع سطر واحد من التعليمات البرمجية
import org . beifengtz . jvmm . server . ServerBootstrap ;
public class Jvmm {
public static void main ( String [] args ) {
ServerBootstrap . getInstance (). start ();
}
} بالطبع ، ستستخدم طريقة بدء التشغيل أعلاه التكوين الافتراضي ، وتتطلب عمومًا تكوينًا مخصصًا. يمكن أن تنتقل طريقة getInstance إلى org.beifengtz.jvmm.server.entity.conf.Configuration . يمكن تنفيذ التكوين المخصص عن طريق بناء التكوين.
قم بتوصيل JVMM ServerConveyDemo.java باستخدام JVMMConnector
عند بدء تشغيل الخادم في وضع jvmm أو http ، يمكنك الاتصال عن بُعد الواجهة المضمنة.

توفر خدمة JVMM واجهات API التالية:
| يكتب | بيانات | وصف |
|---|---|---|
| JVMM_COLLECT_SYS_INFO | / | جمع معلومات نظام التشغيل |
| JVMM_COLLECT_SYS_MEMORY_INFO | / | جمع بيانات ذاكرة نظام التشغيل |
| JVMM_COLLECT_SYS_FILE_INFO | / | جمع بيانات استخدام قسم نظام التشغيل نظام التشغيل |
| JVMM_COLLECT_PROCESS_INFO | / | جمع بيانات العملية الحالية |
| JVMM_COLLECT_DISK_INFO | / | جمع بيانات قرص الآلة الفعلية |
| JVMM_COLLECT_DISK_IO_INFO | / | اجمع قرص IO وإنتاجية بيانات الجهاز الفعلي |
| JVMM_COLLECT_CPU_INFO | / | جمع بيانات تحميل وحدة المعالجة المركزية للآلة الفعلية |
| jvmm_collect_network_info | / | جمع معلومات بطاقة شبكة الجهاز الفعلي وبيانات IO |
| JVMM_COLLECT_PORT_STATUS | JSONARRAY ، عنصره هو رقم المنفذ | جمع استخدام منفذ الجهاز المادي |
| JVMM_COLLECT_JVM_CLASSLOADING_INFO | / | جمع معلومات تحميل فئة JVM |
| JVMM_COLLECT_JVM_CLASSLOADER_INFO | / | جمع معلومات اللودر من فئة JVM |
| jvmm_collect_jvm_compilation_info | / | جمع معلومات تجميع JVM |
| JVMM_COLLECT_JVM_GC_INFO | / | جمع معلومات جامع القمامة JVM |
| JVMM_COLLECT_JVM_MEMORY_MANAGER_INFO | / | جمع معلومات مدير الذاكرة JVM |
| JVMM_COLLECT_JVM_MEMORY_POOL_INFO | / | جمع معلومات تجمع الذاكرة JVM |
| JVMM_COLLECT_JVM_MEMORY_INFO | / | جمع استخدام ذاكرة JVM |
| JVMM_COLLECT_JVM_THREAD_INFO | / | جمع إحصائيات موضوع JVM |
| JVMM_COLLECT_JVM_THREAD_STACK | انظر ThreadInfodto | جمع بيانات مكدس مؤشر ترابط JVM المحددة |
| jvmm_collect_jvm_thread_detail | jsonarray ، العنصر الذي هو معرف الخيط | جمع تفاصيل موضوع JVM (وقت وحدة المعالجة المركزية ، وقت الحظر ، الأقفال ، إلخ) |
| jvmm_collect_jvm_thread_pool | jsonobject ، خصائصها هي: classloaderhash (سلسلة) ، clazz (سلسلة) ، مثيل Field (سلسلة) ، الحقل (السلسلة) | جمع معلومات تجمع مؤشرات ترابط JVM |
| jvmm_collect_jvm_thread_ordered_cpu_time | jsonobject ، خصائصها هي: اكتب (سلسلة ، مكدس | معلومات) ، durationseconds (int) | الحصول على استخدام وحدة المعالجة المركزية في خيوط JVM في غضون وقت معين |
| JVMM_COLLECT_JVM_DUMP_THREAD | / | تفريغ جميع بيانات مكدس الموضوع |
| JVMM_COLLECT_BATCH | CollectionType [] | جمع البيانات على دفعات بناء على الخيارات |
| JVMM_EXECUTE_GC | / | تنفيذ GC |
| JVMM_EXECUTE_JAVA_PROCESS | / | قائمة جميع عمليات Java |
| jvmm_execute_jvm_tool | خيط | قم بتنفيذ أمر JVM Tool |
| JVMM_EXECUTE_JAD | jsonobject ، خصائصها هي: className (سلسلة) ، methodname (سلسلة) | فك الرمز (يتم دعم الوكلاء فقط) |
| JVMM_EXECUTE_LOAD_PATCH | Jsonarray ، عنصره هو patchdto | رمز التحديثات الساخنة. عند تحديد تجزئة ClassLoader ، فإن التحديثات الساخنة فقط لتغيير الفئة المحملة بواسطة ClassLoader. |
| jvmm_execute_switches_get | / | احصل على معلومات مفتاح الاستحواذ |
| jvmm_execute_switches_set | jsonobject ، خصائصها هي: أسماء (مفاتيح []) ، مفتوحة (منطقية) | قم بإعداد مفتاح الاستحواذ |
| jvmm_profiler_sample | انظر profilersampledto | توليد خريطة اللهب |
| jvmm_profiler_execute | خيط | قم بتنفيذ أمر profiler ، انظر Async-Profiler |
| jvmm_profiler_start | انظر profilersampledto ، حيث eventcounterinteval فقط صالح | قم بتنفيذ أمر STARTH SARPLING |
| JVMM_PROFILER_STOP | سلسلة ، حقل التنسيق في profilersampledto ، القيمة الاختيارية هي htmltxtjfr | قم بتنفيذ الأوامر المفيدة لإنهاء أخذ العينات وأمر ملف التصدير |
| jvmm_profiler_status | / | احصل على حالة الوفيل الحالية |
| jvmm_profiler_list_events | / | احصل على أحداث Profiler التي تدعمها البيئة الحالية |
| JVMM_Server_Shutdown | خيط | أغلق الخدمة ، البيانات هي نوع الخدمة |

توفر خدمة HTTP واجهات API التالية:
| أوري | طريقة | المعلمة | جسم | يصف |
|---|---|---|---|---|
| /جمع/العملية | يحصل | / | / | جمع معلومات العملية |
| /جمع/قرص | يحصل | / | / | جمع بيانات قرص الآلة الفعلية |
| /جمع/disk_io | يحصل | / | / | اجمع قرص IO وإنتاجية بيانات الجهاز الفعلي |
| /جمع/وحدة المعالجة المركزية | يحصل | / | / | جمع بيانات تحميل وحدة المعالجة المركزية للآلة الفعلية |
| /جمع/شبكة | يحصل | / | / | جمع معلومات بطاقة شبكة الجهاز الفعلي وبيانات IO |
| /جمع/sys | يحصل | / | / | جمع معلومات نظام التشغيل |
| /جمع/sys/الذاكرة | يحصل | / | / | جمع بيانات ذاكرة نظام التشغيل |
| /جمع/sys/ملف | يحصل | / | / | جمع بيانات استخدام قسم نظام التشغيل نظام التشغيل |
| /جمع/منفذ | يحصل | الموانئ (int []) | / | الحصول على مهنة منفذ نظام التشغيل |
| /جمع/jvm/classloading | يحصل | / | / | جمع معلومات تحميل فئة JVM |
| /جمع/JVM/classloader | يحصل | / | / | جمع معلومات اللودر من فئة JVM |
| /جمع/JVM/التجميع | يحصل | / | / | جمع معلومات تجميع JVM |
| /جمع/JVM/GC | يحصل | / | / | جمع معلومات جامع القمامة JVM |
| /جمع/jvm/memory_manager | يحصل | / | / | جمع معلومات مدير الذاكرة JVM |
| /جمع/jvm/memory_pool | يحصل | / | / | جمع معلومات تجمع الذاكرة JVM |
| /جمع/JVM/الذاكرة | يحصل | / | / | جمع استخدام ذاكرة JVM |
| /جمع/JVM/الموضوع | يحصل | / | / | جمع إحصائيات موضوع JVM |
| /جمع/jvm/thread_stack | بريد | / | انظر ThreadInfodto | جمع بيانات مكدس مؤشر ترابط JVM المحددة |
| /جمع/jvm/dump_thread | يحصل | / | / | تفريغ جميع بيانات مكدس الموضوع |
| /جمع/jvm/thread_ordered_cpu_time | يحصل | اكتب (سلسلة ، مكدس | info) ، durationseconds (int) | / | الحصول على استخدام وحدة المعالجة المركزية في خيوط JVM في غضون وقت معين |
| /جمع/jvm/thread_detail | يحصل | معرف (طويل []) | / | جمع تفاصيل موضوع JVM (وقت وحدة المعالجة المركزية ، وقت الحظر ، الأقفال ، إلخ) |
| /جمع/jvm/thread_pool | يحصل | classloaderhash (سلسلة) ، clazz (سلسلة) ، مثيل Field (سلسلة) ، حقل (سلسلة) | / | جمع معلومات تجمع مؤشرات ترابط JVM |
| /جمع/by_options | يحصل | الخيارات (CollectionType []) | جمع البيانات على دفعات بناء على الخيارات | |
| /تنفيذ/GC | يحصل | / | / | تنفيذ GC |
| /تنفيذ/JPS | يحصل | / | / | قائمة جميع عمليات Java |
| /تنفيذ/jvm_tool | بريد | / | الأمر (سلسلة) | قم بتنفيذ أمر JVM Tool |
| /تنفيذ/جاد | يحصل | className (سلسلة) ، MethodName (سلسلة) | / | فك الرمز (يتم دعم الوكلاء فقط) |
| /تنفيذ/load_patch | بريد | / | Jsonarray ، عنصره هو patchdto | رمز التحديثات الساخنة. عند تحديد تجزئة ClassLoader ، فإن التحديثات الساخنة فقط لتغيير الفئة المحملة بواسطة ClassLoader. |
| /تنفيذ/get_switches | يحصل | / | / | احصل على معلومات مفتاح الاستحواذ |
| /تنفيذ/set_switches | يحصل | أسماء (مفاتيح []) ، فتح (منطقية) | / | قم بإعداد مفتاح الاستحواذ |
| /profiler/flame_graph | بريد | / | انظر profilersampledto | توليد خريطة اللهب |
| /profiler/start | بريد | / | انظر profilersampledto ، حيث eventcounterinteval فقط صالح | قم بتنفيذ أمر STARTH SARPLING |
| /profiler/توقف | بريد | / | سلسلة ، حقل التنسيق في profilersampledto ، القيمة الاختيارية هي htmltxtjfr | قم بتنفيذ الأوامر المفيدة لإنهاء أخذ العينات وأمر ملف التصدير |
| /profiler/الحالة | يحصل | / | / | احصل على حالة الوفيل الحالية |
| /profiler/list_events | يحصل | / | / | احصل على أحداث Profiler التي تدعمها البيئة الحالية |
| /profiler/تنفيذ | بريد | / | الأمر (سلسلة) | قم بتنفيذ أمر profiler ، انظر Async-Profiler |
| /خادم/إيقاف | يحصل | الهدف (سلسلة) | / | أغلق الخدمة ، البيانات هي نوع الخدمة |

يتمثل منطق التشغيل في وضع Sentinel في جمع عناصر بيانات محددة بانتظام ثم دفعها إلى المشتركين . تحتاج إلى توفير خدمة اشتراك (واجهة HTTP) التي يمكن أن تتلقى البيانات. إذا كان الوصول إلى الواجهة يتطلب مصادقة للهوية ، فإن واجهة HTTP المشترك تدعم حاليًا المصادقة الأساسية حاليًا.
تكوين وضع الحارس
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
...يتم دعم ما مجموعه عناصر التجميع التالية:
[
" 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 "
]حاليا فقط عناصر المجموعة التالية دعم بروميثيوس
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]يوفر JVMM لوحات معلومات عن قالب Grafana ، وهما: Node و JVM
قالب العقدة عبارة عن مجموعة من عناصر المراقبة المتعلقة بالنظام ، والتي يمكن أن تساعدك على التركيز أكثر على مراقبة بيانات الآلات الفعلية أو المضيفين السحابيين.


طريقة الاستيراد: استيراد لوحة المعلومات معرف 20430 أو استيراد لوحة القيادة node.json
للتعاون مع هذا القالب ، يجب تكوين المهام التالية:
[
" process " ,
" disk_io " ,
" cpu " ,
" network " ,
" sys " ,
" sys_memory " ,
" sys_file "
]قالب JVM عبارة عن مجموعة من عناصر المراقبة المتعلقة بـ JVM ، والتي يمكن أن تساعدك على التركيز أكثر على بيانات مراقبة العملية.


طريقة الاستيراد: استيراد لوحة معلومات معرف 20429 أو استيراد لوحة القيادة-JVM.Json
للتعاون مع هذا القالب ، يجب تكوين المهام التالية:
[
" process " ,
" jvm_classloading " ,
" jvm_compilation " ,
" jvm_gc " ,
" jvm_memory " ,
" jvm_memory_pool " ,
" jvm_thread "
]إذا كنت ترغب في تطوير ثانوية بناءً على JVMM ، فأنت بحاجة فقط إلى تقديم تبعيات أساسية
< dependency >
< groupId >io.github.tzfun.jvmm</ groupId >
< artifactId >jvmm-core</ artifactId >
< version >${jvmm-version}</ version >
</ dependency > يمكن الحصول على جميع الواجهات الوظيفية لاكتساب البيانات الذي يوفره الخادم السابق والواجهات الوظيفية الأخرى التي لا توفر واجهات الاتصال عن بُعد من خلال فئة المصنع: org.beifengtz.jvmm.core.JvmmFactory
public class Jvmm {
public static void main ( String [] args ) {
// 提供所有的数据采集接口
JvmmCollector collector = JvmmFactory . getCollector ();
// 提供所有的执行接口
JvmmExecutor executor = JvmmFactory . getExecutor ();
// 提供火焰图生成器
JvmmProfiler profiler = JvmmFactory . getProfiler ();
}
}توفر أداة عميل JVMM طريقة بسيطة وسريعة للاتصال بـ JVMM عن بعد. بطبيعة الحال ، فإنه يتعهد أيضًا وظائف مهمة مثل إرفاق الخادم وتوليد الجرار التبعية.
توفر أداة العميل وظيفة تنفيذ أمر bootstrap ، وسيتم تنفيذها استفسارًا حتى لو لم تأخذ أي معلمات. للاستخدام المحدد ، يرجى استخدام الأمر التالي لعرض وثيقة المساعدة:
java -jar jvmm.jar -hمثال على الحصول على البيانات بواسطة أداة العميل
توليد مثال مخطط اللهب

مثال استدعاء رمز
مثال تطبيق لوحة القيادة المخصصة

يمكن استخدام بعض المكونات الموجودة داخل المشروع بدون المشروع ، خفيفة الوزن وسهلة الاستخدام
والسبب هو أن بيئتك لا تحتوي على أدوات JDK أو متغيرات البيئة لم يتم تكوينها. يرجى التأكد من تثبيت بيئتك مع JDK بدلاً من JRE فقط. التحقق البسيط: قم بتنفيذ jps -l في بيئتك ، وإذا كان يمكن تنفيذه بشكل طبيعي وإخراج النتيجة ، فهذا يعني أن البيئة على ما يرام.
الحل: قم بتكوين دليل JDK bin المحلي كمتغير للبيئة
إذا بدأت jvmm-server.jar ، والسبب هو أنك تستخدم JDK 9 وما فوق ، تحظر Java الوصول العاكس إلى بعض الفئات التي تبدأ بـ 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
الحل: أضف معلمات الجهاز الظاهري التالي
# 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 إذا No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1' ، والسبب هو أن kernel النظام يحظر اكتشاف أداء النظام افتراضيًا ، وتحتاج إلى تمكين هذا الخيار.
sudo systcl -w kernel.perf_event_paranoid=1أو تعديل ملف SYSCTL
sudo sh -c ' echo "kernel.perf_event_paranoid=1" >> /etc/sysctl.conf '
sudo sysctl -pهذه الأداة مفتوحة المصدر تمامًا ومجاني ، وليس من السهل إنشاءها. إذا كنت تعتقد أنه جيد ، فيمكنك التبرع لدعم هذا المشروع.
قائمة التبرع:
إذا واجهت أي مشاكل أثناء الاستخدام ، أو لديك رؤى أو اقتراحات فريدة حول هذا المشروع ، فيرجى تقديم مشكلة أو إرسال رسالة خاصة إلي
البريد الإلكتروني: [email protected]
WeChat: Beifeng-TZ (يرجى ملاحظة JVMM إذا قمت بإضافتها)