Jconsole ile erişim için JVM'de JMX nasıl etkinleştirilir?
Jconsole ile erişim için JVM'de JMX nasıl etkinleştirilir?
Yanıtlar:
İ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=false
zorunlu 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
com.sun.management.jmxremote
Varsayı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=true
Ref: docs.oracle.com/javase/8/docs/technotes/guides/management/…
Dcom.sun.management.jmxremote.rmi.port=9011
gü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ı?
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 . jconsole
Bu değeri ayarlamak için hemen belli bir yerde görmedim . Bağlantılı makalede süreç:
jconsole
Günlüğe kaydetme etkinken bağlanmayı deneyinjconsole
çalışıldığını bulmaiptables
/ firewall
kurallarını gerektiği gibi kullanınBu ç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:
Ardından, yeni Uzak Ana Bilgisayar Bağlantısına sağ tıklayın ve Add JMX Connection...
İç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.
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
Herhangi bir yerde kullanmama gerek yoktu - localhost
docker görüntüsünü çalıştırırken portları kullandım ve yönlendirdim: -p 9998:9998, -p 9999:9999
vb.
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.
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
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/hosts
ana 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
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 .
-Dcom.sun.management.jmxremote.ssl=false
? jconsole
Bir hata göstermeli mi yoksa sessizce bağlanamaz mı?
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.
Ö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
.
sudo lsof -i:1234
benim için hiçbir şey göstermiyor
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 .
Bu sorunu yaşadım ve doğru ayarları test etmek ve anlamak için bir GitHub projesi oluşturdum .
Dockerfile
Destekleyici komut dosyalarıyla bir çalışma ve docker-compose.yml
hızlı test için basit bir içerir .