Jconsole के साथ उपयोग करने के लिए मेरे JVM पर JMX को कैसे सक्रिय करें?


223

Jconsole के साथ उपयोग के लिए JVM पर JMX को कैसे सक्रिय करें?


32
यह allowd है, और वास्तव में यह मेरे लिए केवल एक अनुस्मारक है, क्योंकि मैं हमेशा भूल जाता हूं कि मापदंडों को कहां से कॉपी करना है और अब मुझे पता है कि मैं इसे कहां
ढूंढता

20
स्टैक एक्सचेंज ने उपयोगकर्ताओं को अपने स्वयं के सवालों के जवाब देने के लिए हमेशा स्पष्ट रूप से प्रोत्साहित किया है, यहां देखें: stackoverflow.com/help/self-answer
टिम ब्यून

11
एक बार से अधिक मैंने कुछ के लिए एसओ को खोजा और एक प्रश्न का उत्तर पाया ... अपने आप से। और उनमें से एक मेरे द्वारा भी पूछा गया था। यही कारण है कि अपने स्वयं के उत्तरों को रखना अच्छा है। इसके अलावा, उन सभी अन्य लोगों के बारे में सोचें, जो आपकी समस्या का सामना कर चुके हैं, यदि आप अपने प्रश्न का उत्तर देते हैं तो आप उनकी भी मदद करेंगे।
माइक मिलर

2
जावा 8 के लिए अपडेटेड डॉक यहां है
एंड्रयू जॉनसन

@ मोरेन: क्या आप अपने बंद किए गए प्रश्न का एक संदर्भ प्रदान कर सकते हैं जिसका आपने स्वयं उत्तर दिया है? यह मेटा पर चर्चा करने लायक हो सकता है।
केविनरपे

जवाबों:


290

प्रासंगिक प्रलेखन यहाँ पाया जा सकता है:

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


9
The -com.sun.management.jmxremote.local.only = झूठी अब Centos पर भी जरूरत है
लेन 7

1
नाइट पिक: यह मेरे लिए अजीब com.sun.management.jmxremoteहै जिसका डिफ़ॉल्ट मान है true। (आप सूर्य धन्यवाद!) सुपर स्पष्ट है, विशेष रूप से करने के लिए JMX nobs कम परिचित उन, मैं का उपयोग करें: com.sun.management.jmxremote=trueरेफरी: docs.oracle.com/javase/8/docs/technotes/guides/management/...
kevinarpe

1
"-Djava.rmi.server.hostname" मेरे लिए एक आकर्षण की तरह काम करता है!
ओरूहन डी।

1
यदि आप SSH सुरंग के माध्यम से दूरस्थ सर्वर से कनेक्ट करने का प्रयास कर रहे हैं, तो होस्टहोस्ट को लोकलहोस्ट पर सेट करना बहुत महत्वपूर्ण है, जो एक बहुत ही सामान्य मामला है।
निखिल ओवलेकर

1
यह तभी काम करता है जब मैं सर्वर पर फ़ायरवॉल को अक्षम करता हूं। मैंने इस उदाहरण में पोर्ट 9010 / tcp खोला है, मैंने Dcom.sun.management.jmxremote.rmi.port=9011फ़ायरवॉल में जोड़ने और खोलने की भी कोशिश की - अभी भी फ़ायरवॉल के साथ कनेक्ट नहीं हो पा रहा है। कोई विचार? क्या मुझे कुछ याद आया?
Carmageddon

70

डॉकटर कन्टेनर में रनिंग ने अतिरिक्त समस्याओं की एक पूरी श्रृंखला पेश की, जिससे यह उम्मीद की जा सकती है कि इससे किसी को मदद मिलेगी। मैंने निम्नलिखित विकल्पों को जोड़ने की आवश्यकता समाप्त की जो मैं नीचे बताऊंगा:

-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...

JMX कनेक्शन जोड़ें

के लिए चेकबॉक्स चेक करना न भूलें Do not require SSL connection। उम्मीद है, कि आपको कनेक्ट करने की अनुमति देनी चाहिए।


-Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.rmi.port=[...]SSH के माध्यम से JMX / RMI को सुरंग बनाने के मामले में भी महत्वपूर्ण है। उन लोगों के बिना, दूरस्थ वस्तुओं को कुछ यादृच्छिक पोर्ट का उपयोग करके सर्वर के सार्वजनिक / मुख्य / ... आईपी का उपयोग करके एक्सेस किया जाता है, जिसे आसानी से अग्रेषित नहीं किया जा सकता है।
Thorsten Schöning

1
मैं पुष्टि कर सकता हूं कि आपको बाहरी रूप से कंटेनर आईपी का उपयोग करने की आवश्यकता है। उदाहरण के लिए यह साथ काम नहीं करता है-Djava.rmi.server.hostname=0.0.0.0
किशमिशस्तीन

मुझे DOCKER_HOST_IPकहीं भी उपयोग करने की आवश्यकता नहीं थी - मैंने localhostडॉकटर छवि को चलाते समय बंदरगाहों का उपयोग किया और आगे बढ़ाया: -p 9998:9998, -p 9999:9999आदि
बार्नी

9

ध्यान दें, नवीनतम अवतार में जावा 6, JMX संकेतन के बिना शुरू किए जाने के बाद भी जंकसोल को एक चल रही प्रक्रिया में संलग्न करने की अनुमति देता है।

यदि यह आपके लिए उपलब्ध है, तो jvisualvm पर भी विचार करें क्योंकि यह एक प्रोफाइलर सहित चल रही प्रक्रियाओं की जानकारी प्रदान करता है।


3
यह केवल तभी काम करता है जब आप उसी होस्ट पर जोकॉम्ब चल रहे हों जिस जेवीएम को आप मॉनिटर करने की कोशिश कर रहे हैं।
ग्रे

1
@ थोरबॉर्न यदि मैं अपने जावा प्रोग्राम को बिना किसी पैरामीटर के शुरू करता हूं और जोंको कंसोल से जुड़ने की कोशिश करता हूं, तो मैं सूची में अपने प्रोग्राम में देखता हूं लेकिन जब मैं कनेक्ट करने की कोशिश करता हूं तो यह विफल हो जाता है। मुझे लगता है कि यह एसएसएल प्रमाणपत्र की कमी के कारण है। मैं बस डेमो देखना चाहता था इसलिए मुझे user3013578 द्वारा उत्तर में निर्दिष्ट मापदंडों का उपयोग करना पड़ा और इसने मेरे लिए काम किया (JDK 1.7, विंडोज 8.1, 64 बिट)।
कप्तान जैक स्पैरो

2
अटैच एपीआई को कुछ प्लेटफॉर्म पर लॉन्च किए गए प्रोग्राम के समान 32/64 बिट जेवीएम के लिए जॉकसोल की आवश्यकता होती है।
थोरबजोरन राव एंडरसन

1
क्या इस व्यवहार को अक्षम करना संभव है?
केविनरपे

7

मैं 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

हाँ आपके जवाब ने मेरे लिए काम किया (JDK 1.7, विंडोज़ 8.1 64 बिट)
कप्तान जैक स्पैरो

6

लिनक्स पर, मैंने निम्नलिखित पैरा का उपयोग किया:

-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) का समाधान करता है


2

निम्नलिखित कमांड लाइन मापदंडों के साथ अपना जावा एप्लिकेशन चलाएं:

-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कोई त्रुटि दिखाई जानी चाहिए , या यह केवल चुपचाप कनेक्ट करने में विफल होगा?
ताबीज

2

नीचे कमांड लाइन मापदंडों के साथ,

-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 का उपयोग करके लिनक्स सर्वर से मिलने वाले आईपैड पर कभी भी भरोसा न करें। आईपी ​​जो आपको मिलता है वह एक नकाबपोश है जो होस्ट फ़ाइल में मौजूद है।


1

पहले आपको यह जांचने की आवश्यकता है कि क्या आपकी जावा प्रक्रिया पहले से ही जेएमएक्स मापदंडों के साथ चल रही है। यह करो:

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


क्या आपको इसे चलाते समय jmx द्वारा पोर्ट 1234 का उपयोग देखने में सक्षम होना चाहिए? sudo lsof -i:1234मेरे लिए कुछ भी नहीं दिखा रहा है
Gorgon_Union

1

चरण 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 के रूप में दर्ज करें और रिमोट एप्लिकेशन से कनेक्ट करने के लिए कनेक्ट बटन पर क्लिक करें।

आप पूर्ण आवेदन के लिए इस लिंक को देख सकते हैं ।


0

मेरे पास यह सटीक मुद्दा था, और सही सेटिंग्स का परीक्षण और पता लगाने के लिए एक GitHub प्रोजेक्ट बनाया

इसमें Dockerfileसहायक स्क्रिप्ट के साथ काम करना शामिल है , और docker-compose.ymlत्वरित परीक्षण के लिए एक सरल ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.