Jconsole के साथ उपयोग के लिए JVM पर JMX को कैसे सक्रिय करें?
Jconsole के साथ उपयोग के लिए JVM पर JMX को कैसे सक्रिय करें?
जवाबों:
प्रासंगिक प्रलेखन यहाँ पाया जा सकता है:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
निम्नलिखित मापदंडों के साथ अपना कार्यक्रम शुरू करें:
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.rmi.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
उदाहरण के लिए इस तरह:
java -Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=9010 \
-Dcom.sun.management.jmxremote.local.only=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar Notepad.jar
-Dcom.sun.management.jmxremote.local.only=false
आवश्यक नहीं है, लेकिन इसके बिना, यह उबंटू पर काम नहीं करता है। त्रुटि कुछ इस तरह होगी:
01 Oct 2008 2:16:22 PM sun.rmi.transport. customer .TCPTransport$AcceptLoop executeAcceptLoop
WARNING: RMI TCP Accept-0: accept loop for ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=37278] throws
java.io.IOException: The server sockets created using the LocalRMIServerSocketFactory only accept connections from clients running on the host where the RMI remote objects have been exported.
at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:89)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:387)
at sun.rmi.transport. customer .TCPTransport$AcceptLoop.run(TCPTransport.java:359)
at java.lang.Thread.run(Thread.java:636)
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672 देखें
साथ ही सावधान रहें,-Dcom.sun.management.jmxremote.authenticate=false
जो किसी के लिए भी उपलब्ध हो, लेकिन यदि आप इसका उपयोग अपने स्थानीय मशीन पर जेवीएम को ट्रैक करने के लिए करते हैं तो इससे कोई फर्क नहीं पड़ता।
अपडेट :
कुछ मामलों में मैं सर्वर तक पहुंचने में सक्षम नहीं था। यह तब तय किया गया था जब मैंने यह पैरामीटर सेट किया था:-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
है जिसका डिफ़ॉल्ट मान है true
। (आप सूर्य धन्यवाद!) सुपर स्पष्ट है, विशेष रूप से करने के लिए JMX nobs कम परिचित उन, मैं का उपयोग करें: com.sun.management.jmxremote=true
रेफरी: docs.oracle.com/javase/8/docs/technotes/guides/management/...
Dcom.sun.management.jmxremote.rmi.port=9011
फ़ायरवॉल में जोड़ने और खोलने की भी कोशिश की - अभी भी फ़ायरवॉल के साथ कनेक्ट नहीं हो पा रहा है। कोई विचार? क्या मुझे कुछ याद आया?
डॉकटर कन्टेनर में रनिंग ने अतिरिक्त समस्याओं की एक पूरी श्रृंखला पेश की, जिससे यह उम्मीद की जा सकती है कि इससे किसी को मदद मिलेगी। मैंने निम्नलिखित विकल्पों को जोड़ने की आवश्यकता समाप्त की जो मैं नीचे बताऊंगा:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=${DOCKER_HOST_IP}
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
DOCKER_HOST_IP
स्थानीय रूप से जोंकोस का उपयोग करने के विपरीत, आपको एक अलग आईपी का विज्ञापन करना होगा जो आपको कंटेनर के भीतर से दिखाई देगा। आपको प्रतिस्थापित करने की आवश्यकता होगी${DOCKER_HOST_IP}
अपने डॉकर होस्ट के बाहरी रिसोल्वेबल आईपी (डीएनएस नाम) ।
जेएमएक्स रिमोट और आरएमआई पोर्ट
ऐसा लगता है कि जेएमएक्स को दूरस्थ प्रबंधन इंटरफ़ेस ( जेस्टैट ) तक पहुंच की आवश्यकता है जो कनेक्शन को मध्यस्थ करते समय कुछ डेटा को स्थानांतरित करने के लिए एक अलग पोर्ट का उपयोग करता है । मैंने तुरंत कहीं भी स्पष्ट रूप से नहीं देखाjconsole
इस मूल्य को निर्धारित करने के लिए । लिंक किए गए लेख में प्रक्रिया थी:
jconsole
लॉगिंग सक्षमjconsole
का उपयोग करने का प्रयास किया गया हैiptables
/ firewall
नियमों का उपयोग करेंहालांकि यह काम करता है, यह निश्चित रूप से एक स्वचालित समाधान नहीं है। मैंने jconsole से VisualVM को अपग्रेड करने का विकल्प चुना क्योंकि यह आपको उस पोर्ट को स्पष्ट रूप से निर्दिष्ट करने के लिए है जिस jstatd
पर चल रहा है। VisualVM में, एक नया दूरस्थ होस्ट जोड़ें और इसे उन मानों के साथ अपडेट करें जो ऊपर निर्दिष्ट लोगों से संबंधित हैं:
फिर नए रिमोट होस्ट कनेक्शन पर राइट-क्लिक करें और Add JMX Connection...
के लिए चेकबॉक्स चेक करना न भूलें Do not require SSL connection
। उम्मीद है, कि आपको कनेक्ट करने की अनुमति देनी चाहिए।
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
SSH के माध्यम से JMX / RMI को सुरंग बनाने के मामले में भी महत्वपूर्ण है। उन लोगों के बिना, दूरस्थ वस्तुओं को कुछ यादृच्छिक पोर्ट का उपयोग करके सर्वर के सार्वजनिक / मुख्य / ... आईपी का उपयोग करके एक्सेस किया जाता है, जिसे आसानी से अग्रेषित नहीं किया जा सकता है।
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
कहीं भी उपयोग करने की आवश्यकता नहीं थी - मैंने localhost
डॉकटर छवि को चलाते समय बंदरगाहों का उपयोग किया और आगे बढ़ाया: -p 9998:9998, -p 9999:9999
आदि
ध्यान दें, नवीनतम अवतार में जावा 6, JMX संकेतन के बिना शुरू किए जाने के बाद भी जंकसोल को एक चल रही प्रक्रिया में संलग्न करने की अनुमति देता है।
यदि यह आपके लिए उपलब्ध है, तो jvisualvm पर भी विचार करें क्योंकि यह एक प्रोफाइलर सहित चल रही प्रक्रियाओं की जानकारी प्रदान करता है।
मैं WAS ND 7.0 का उपयोग कर रहा हूँ
JConsole में नजर रखने के लिए मेरे JVM को निम्नलिखित सभी तर्कों की आवश्यकता है
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
लिनक्स पर, मैंने निम्नलिखित पैरा का उपयोग किया:
-Djavax.management.builder.initial=
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
और मैंने यह भी संपादित किया /etc/hosts
कि मेजबाननाम लूपबैक पते (127.0.0.1) के बजाय मेजबान पते (192.168.0.x) का समाधान करता है
निम्नलिखित कमांड लाइन मापदंडों के साथ अपना जावा एप्लिकेशन चलाएं:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.ssl = false का उपयोग करना महत्वपूर्ण हैयदि आप jmx होस्ट पर डिजिटल प्रमाणपत्र सेटअप नहीं करना चाहते हैं तो पैरामीटर ।
यदि आप एक मशीन आईपी पते होने पर आपके आवेदन शुरू कर दिया तो 192.168.0.1 , खुले JConsole , डाल 192.168.0.1:8855 में रिमोट प्रक्रिया क्षेत्र, और क्लिक करें कनेक्ट ।
-Dcom.sun.management.jmxremote.ssl=false
? क्या jconsole
कोई त्रुटि दिखाई जानी चाहिए , या यह केवल चुपचाप कनेक्ट करने में विफल होगा?
नीचे कमांड लाइन मापदंडों के साथ,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
कभी-कभी linux सर्वर में, imx कनेक्शन सफल नहीं होता है। ऐसा इसलिए है, क्योंकि क्लाउड लिनेक्स होस्ट में, / etc / मेजबानों में, ताकि होस्टनाम होस्ट के पते पर हल हो जाए।
इसे ठीक करने का सबसे अच्छा तरीका है, नेटवर्क में अन्य मशीन से विशेष लिनक्स सर्वर को पिंग करना और उस होस्ट आईपी पते का उपयोग करना
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
लेकिन ifconfig.me का उपयोग करके लिनक्स सर्वर से मिलने वाले आईपैड पर कभी भी भरोसा न करें। आईपी जो आपको मिलता है वह एक नकाबपोश है जो होस्ट फ़ाइल में मौजूद है।
पहले आपको यह जांचने की आवश्यकता है कि क्या आपकी जावा प्रक्रिया पहले से ही जेएमएक्स मापदंडों के साथ चल रही है। यह करो:
ps -ef | grep java
मॉनिटर करने के लिए आपको अपनी जावा प्रक्रिया की जाँच करें। यदि आप jmx rmi पैरामीटर को Djmx.rmi.registry.port = xxxx देख सकते हैं तो अपने java visualvm में यहाँ वर्णित पोर्ट का उपयोग करके इसे jmx कनेक्शन के तहत दूरस्थ रूप से कनेक्ट करें।
अगर यह jmx rmi पोर्ट से नहीं चल रहा है, तो आपको नीचे दिए गए मापदंडों के साथ अपनी जावा प्रक्रिया को चलाने की आवश्यकता है:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
नोट: पोर्ट नंबर आपकी पसंद पर आधारित हैं।
अब आप इस पोर्ट का उपयोग jmx coneection के लिए कर सकते हैं। यहाँ यह बंदरगाह है 1234
।
sudo lsof -i:1234
मेरे लिए कुछ भी नहीं दिखा रहा है
चरण 1: निम्नलिखित मापदंडों का उपयोग करके एप्लिकेशन को चलाएं।
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
ऊपर दिए गए तर्क आवेदन को पोर्ट 9999 में बांध देते हैं।
चरण 2: कमांड प्रॉम्प्ट या टर्मिनल में कमांड जोंकॉल को निष्पादित करके जोंकॉस लॉन्च करें।
'रिमोट प्रोसेस:' चुनें और url को {IP_Address}: 9999 के रूप में दर्ज करें और रिमोट एप्लिकेशन से कनेक्ट करने के लिए कनेक्ट बटन पर क्लिक करें।
आप पूर्ण आवेदन के लिए इस लिंक को देख सकते हैं ।
मेरे पास यह सटीक मुद्दा था, और सही सेटिंग्स का परीक्षण और पता लगाने के लिए एक GitHub प्रोजेक्ट बनाया ।
इसमें Dockerfile
सहायक स्क्रिप्ट के साथ काम करना शामिल है , और docker-compose.yml
त्वरित परीक्षण के लिए एक सरल ।