Jconsole ile erişim için JVM üzerinde JMX nasıl etkinleştirilir?


224

Jconsole ile erişim için JVM'de JMX nasıl etkinleştirilir?


32
izin verilen ve aslında benim için sadece bir hatırlatma, çünkü her zaman parametreleri nereden kopyalayacağımı unutuyorum ve şimdi nerede bulduğumu biliyorum :-)
Mauli 15:09

20
Stack Exchange, kullanıcıları her zaman açıkça kendi sorularını cevaplamaları için cesaretlendirmiştir, buraya bakın: stackoverflow.com/help/self-answer
Tim Büthe

11
Bir kereden fazla SO'yu bir şey aradım ve cevapladığım bir soru buldum ... kendim. Bunlardan biri de benden istedi. Bu yüzden kendi cevaplarınızı koymak iyi bir şeydir. Ayrıca, sorununuzla karşılaşmış olabilecek diğer insanları da düşünün, eğer sorunuzu cevaplarsanız, onlara da yardımcı olacaksınız.
Mike Miller

2
Java 8 için güncellenmiş doc burada
Andrew Johnston

@Mauren: Kendi cevapladığınız kapalı sorunuza bir referans verebilir misiniz? Meta üzerinde tartışmaya değer olabilir.
kevinarpe

Yanıtlar:


291

İlgili belgeleri burada bulabilirsiniz:

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

Programınızı aşağıdaki parametrelerle başlatın:

-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

Örneğin şöyle:

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=falsezorunlu olarak gerekli değildir, ancak onsuz Ubuntu üzerinde çalışmaz. Hata şuna benzer:

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)

bkz. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672

Ayrıca-Dcom.sun.management.jmxremote.authenticate=false , erişimi herkes için kullanılabilir hale getirirken de dikkatli olun , ancak yalnızca yerel makinenizdeki JVM'yi izlemek için kullanırsanız önemli değildir.

Güncelleme :

Bazı durumlarda sunucuya erişemedim. Bu parametreyi de ayarladığımda bu düzeltildi:-Djava.rmi.server.hostname=127.0.0.1


9
Centos'ta -Dcom.sun.management.jmxremote.local.only = false gereklidir
LenW

1
Nit pick: com.sun.management.jmxremoteVarsayılan değeri olan benim için garip true. (Teşekkürler Sun!) Özellikle JMX nobs'larına daha az aşina olanlar için çok net olmak için şunu kullanıyorum: com.sun.management.jmxremote=trueRef: docs.oracle.com/javase/8/docs/technotes/guides/management/…
kevinarpe

1
"-Djava.rmi.server.hostname" benim için bir cazibe gibi çalıştı!
Orhun

1
SSH tüneli üzerinden uzak bir sunucuya bağlanmaya çalışıyorsanız, ana bilgisayar adını localhost olarak ayarlamak çok önemlidir, ki bu çok yaygın bir durumdur.
Nikhil Owalekar

1
Yalnızca sunucudaki güvenlik duvarını devre dışı bıraktığımda çalışır. Bu örnekte 9010 / tcp portunu açtım, ayrıca Dcom.sun.management.jmxremote.rmi.port=9011güvenlik duvarına eklemeye ve açmaya çalıştım - hala güvenlik duvarı yukarıdayken bağlanamıyorum. Düşüncesi olan var mı? Bir şey kaçırdım mı?
Carmageddon

70

Docker kapsayıcısında koşmak, bağlanmak için bir dizi ek sorun getirdi, bu da umarım bu birine yardımcı olur. Aşağıda açıklayacağım aşağıdaki seçenekleri eklemem gerekiyordu:

-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

Jconsole'u yerel olarak kullanmanın aksine, büyük olasılıkla kapsayıcıdan göreceğinizden farklı bir IP reklamı yapmanız gerekir. ${DOCKER_HOST_IP}Docker ana makinenizin harici olarak çözülebilir IP'si (DNS Adı) ile değiştirmeniz gerekir .

JMX Uzak ve RMI Bağlantı Noktaları

Görünüşe göre JMX, bağlantıyı tahsis ederken bazı verileri aktarmak için farklı bir bağlantı noktası kullanan bir uzaktan yönetim arabirimine ( jstat ) erişim gerektirir . jconsoleBu değeri ayarlamak için hemen belli bir yerde görmedim . Bağlantılı makalede süreç:

  • jconsoleGünlüğe kaydetme etkinken bağlanmayı deneyin
  • Başarısız
  • Hangi bağlantı noktasının kullanılmaya jconsoleçalışıldığını bulma
  • Bağlantı noktasının bağlanmasına izin vermek için iptables/ firewallkurallarını gerektiği gibi kullanın

Bu çalışırken, kesinlikle otomatikleştirilebilir bir çözüm değildir. Jconsole'dan VisualVM'ye yükseltme yapmayı seçtim, çünkü açıkça jstatdçalışmakta olan bağlantı noktasını belirtmenize izin verelim . VisualVM'de, yeni bir Uzak Ana Bilgisayar ekleyin ve bunu yukarıda belirtilenlerle ilişkili değerlerle güncelleyin:

Uzak Ana Makine Ekle

Ardından, yeni Uzak Ana Bilgisayar Bağlantısına sağ tıklayın ve Add JMX Connection...

JMX Bağlantısı Ekle

İçin onay kutusunu işaretlemeyi unutmayın Do not require SSL connection. Umarım, bu bağlantı kurmanıza izin vermelidir.


-Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote.rmi.port=[...]SSX üzerinden JMX / RMI tünellemesi için de anahtardır. Bunlar olmadan uzak nesnelere, sunucunun genel / ana / ... IP'si kullanılarak, kolayca iletilemeyen bazı rastgele bağlantı noktaları kullanılarak erişilir.
Thorsten Schöning

1
Dıştan IP'ye konteyner kullanmanız gerektiğini doğrulayabilirim. Örneğin, işe yaramaz-Djava.rmi.server.hostname=0.0.0.0
raisercostin

DOCKER_HOST_IPHerhangi bir yerde kullanmama gerek yoktu - localhostdocker görüntüsünü çalıştırırken portları kullandım ve yönlendirdim: -p 9998:9998, -p 9999:9999vb.
Barney

9

En son enkarnasyondaki Java 6, jconsole'un JMX eklemeleri olmadan başlatıldıktan sonra bile çalışan bir işleme bağlanmasına izin verir.

Bu sizin için uygunsa, bir profil oluşturucu da dahil olmak üzere çalışan işlemler hakkında zengin bir bilgi sağladığı için jvisualvm'i de düşünün.


3
Bu yalnızca jconsole'u izlemeye çalıştığınız JVM ile aynı ana bilgisayarda çalıştırıyorsanız çalışır.
Gri

1
@ Thorbjorn Java programımı herhangi bir parametre olmadan başlatır ve jconsole ile bağlanmaya çalışırsam, listede programımda görüyorum ama bağlanmaya çalıştığımda başarısız oluyor. Sanırım bunun nedeni SSL sertifikalarının olmaması. Ben sadece demo görmek istedim dolayısıyla user3013578 tarafından cevap belirtilen parametreleri kullanmak zorunda kaldı ve benim için çalıştı (JDK 1.7, Windows 8.1, 64 bit).
Kaptan Jack Sparrow

2
Attach API, jconsole'un bazı platformlarda başlatılan programla aynı 32/64 bit JVM'ye sahip olmasını gerektirir.
Thorbjørn Ravn Andersen

1
Bu davranışı devre dışı bırakmak mümkün mü?
kevinarpe

7

WAS ND 7.0 kullanıyorum

JVM'm JConsole'de aşağıdaki argümanların izlenmesine ihtiyaç duyuyor

    -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

Evet cevabınız benim için çalıştı (JDK 1.7, windows 8.1 64 bit)
Kaptan Jack Sparrow

6

Linux'ta aşağıdaki parametreleri kullandım:

-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

ve ayrıca /etc/hostsana bilgisayar adının geridöngü adresi (127.0.0.1) yerine ana bilgisayar adresine (192.168.0.x) çözümlenmesi için düzenledim


2

Java uygulamanızı aşağıdaki komut satırı parametreleriyle çalıştırın:

-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Eğer jmx ana bilgisayarında dijital sertifika ayarlamak istemiyorsanız -Dcom.sun.management.jmxremote.ssl = false parametresini kullanmanız önemlidir .

Uygulamanızı 192.168.0.1 IP adresine sahip bir makinede başlattıysanız , jconsole'u açın , Uzaktan İşlem alanına 192.168.0.1:8855 yazın ve Bağlan'a tıklayın .


Unutursanız beklenen davranış nedir -Dcom.sun.management.jmxremote.ssl=false? jconsoleBir hata göstermeli mi yoksa sessizce bağlanamaz mı?
amacleod

2

aşağıdaki komut satırı parametreleriyle birlikte,

-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Bazen linux sunucularında, imx bağlantısı başarılı olmaz. bunun nedeni, bulut linux ana bilgisayarında, / etc / hosts içinde ana bilgisayar adının ana makine adresine çözümlenmesidir.

düzeltmenin en iyi yolu, belirli linux sunucusuna ağdaki diğer makineden ping atmak ve bu ana bilgisayar IP adresini

-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.

Ancak, ifconfig.me kullanarak linux sunucusundan aldığınız ipadresi asla kullanmayın. Orada elde ettiğiniz ip host dosyasında bulunan maskeli bir ip.


1

Öncelikle, java işleminizin JMX parametreleriyle zaten çalışıp çalışmadığını kontrol etmeniz gerekir. Bunu yap:

ps -ef | grep java

İzlemeniz gereken java sürecinizi kontrol edin. Jmx rmi parametresini Djmx.rmi.registry.port = xxxx görebiliyorsanız , jmx bağlantısı altında uzaktan bağlamak için java visualvm'nizde burada belirtilen bağlantı noktasını kullanın.

Eğer jmx rmi portu üzerinden çalışmıyorsa, java sürecinizi aşağıda belirtilen parametrelerle çalıştırmanız gerekir:

-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

Not: bağlantı noktası numaraları seçiminize bağlıdır.

Şimdi bu bağlantı noktasını jmx koneksiyonu için kullanabilirsiniz. İşte liman 1234.


Bunu çalıştırdıktan sonra 1234 numaralı bağlantı noktasını jmx tarafından kullanımda görebilmeniz gerekir mi? sudo lsof -i:1234benim için hiçbir şey göstermiyor
Gorgon_Union

1

Adım 1: Aşağıdaki parametreleri kullanarak uygulamayı çalıştırın.

-Dcom.sun.management.jmxremote.port=9999 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false

Yukarıdaki argümanlar uygulamayı 9999 numaralı bağlantı noktasına bağlar.

Adım 2: Komut isteminde veya terminalde jconsole komutunu yürüterek jconsole'u başlatın.

'Uzaktan İşlem:' seçimini yapın ve URL'yi {IP_Address}: 9999 olarak girin ve uzak uygulamaya bağlanmak için Bağlan düğmesine tıklayın.

Tam başvuru için bu bağlantıya başvurabilirsiniz .


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.