Bagaimana cara mengaktifkan JMX pada JVM untuk akses dengan jconsole?
Bagaimana cara mengaktifkan JMX pada JVM untuk akses dengan jconsole?
Jawaban:
Dokumentasi yang relevan dapat ditemukan di sini:
http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html
Mulai program Anda dengan parameter berikut:
-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
Misalnya seperti ini:
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
tidak harus diperlukan tetapi tanpa itu, itu tidak berfungsi di Ubuntu. Kesalahannya akan seperti ini:
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)
lihat http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6754672
Juga berhati-hatilah dengan-Dcom.sun.management.jmxremote.authenticate=false
yang membuat akses tersedia bagi siapa saja, tetapi jika Anda hanya menggunakannya untuk melacak JVM pada mesin lokal Anda, itu tidak masalah.
Perbarui :
Dalam beberapa kasus saya tidak dapat menjangkau server. Ini kemudian diperbaiki jika saya mengatur parameter ini juga:-Djava.rmi.server.hostname=127.0.0.1
com.sun.management.jmxremote
memiliki nilai default sebagai true
. (Terima kasih Sun!) Untuk menjadi sangat jelas, terutama bagi mereka yang tidak terlalu mengenal JMX, saya menggunakan: com.sun.management.jmxremote=true
Ref: docs.oracle.com/javase/8/docs/technotes/guides/management/…
Dcom.sun.management.jmxremote.rmi.port=9011
dan membuka di firewall - masih tidak dapat terhubung dengan firewall yang sedang menyala. Adakah pikiran? Apakah saya melewatkan sesuatu?
Menjalankan dalam wadah Docker memperkenalkan banyak masalah tambahan untuk menghubungkan jadi mudah-mudahan ini membantu seseorang. Saya akhirnya perlu menambahkan opsi berikut yang akan saya jelaskan di bawah:
-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
Tidak seperti menggunakan jconsole secara lokal, Anda harus mengiklankan IP yang berbeda dari yang mungkin Anda lihat dari dalam wadah. Anda harus mengganti ${DOCKER_HOST_IP}
dengan IP (Nama DNS) yang dapat diatasi secara eksternal dari host Docker Anda.
JMX Remote & RMI Ports
Sepertinya JMX juga memerlukan akses ke antarmuka manajemen jarak jauh ( jstat ) yang menggunakan port berbeda untuk mentransfer beberapa data saat menengahi koneksi. Saya tidak melihat di mana pun segera jelas dalam jconsole
menetapkan nilai ini. Dalam artikel yang ditautkan prosesnya adalah:
jconsole
dengan logging diaktifkanjconsole
ingin digunakaniptables
/ firewall
aturan seperlunya untuk memungkinkan port terhubungSementara itu berhasil, itu tentu saja bukan solusi yang dapat diautomatiskan. Saya memilih untuk upgrade dari jconsole ke VisualVM karena memungkinkan Anda untuk secara eksplisit menentukan port yang jstatd
sedang berjalan. Dalam VisualVM, tambahkan Host Remote Baru dan perbarui dengan nilai-nilai yang berkorelasi dengan yang ditentukan di atas:
Kemudian klik kanan Remote Host Connection dan Add JMX Connection...
Jangan lupa untuk mencentang kotak centang Do not require SSL connection
. Semoga itu memungkinkan Anda terhubung.
-Djava.rmi.server.hostname=localhost
-Dcom.sun.management.jmxremote.rmi.port=[...]
juga merupakan kunci dalam hal tunneling JMX / RMI melalui SSH. Tanpa itu, objek jarak jauh diakses menggunakan IP publik / utama / ... dari server menggunakan beberapa port acak, yang tidak dapat diteruskan dengan mudah.
-Djava.rmi.server.hostname=0.0.0.0
DOCKER_HOST_IP
mana saja - Saya hanya menggunakan localhost
dan meneruskan port ketika menjalankan gambar buruh pelabuhan: -p 9998:9998, -p 9999:9999
dll.
Catatan, Java 6 dalam inkarnasi terbaru memungkinkan jconsole untuk melampirkan dirinya ke proses yang berjalan bahkan setelah dimulai tanpa mantra JMX.
Jika itu tersedia untuk Anda, pertimbangkan juga jvisualvm karena menyediakan banyak informasi tentang proses yang berjalan, termasuk profiler.
Saya menggunakan WS WS 7.0
JVM saya perlu semua argumen berikut untuk dipantau di JConsole
-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
Di Linux, saya menggunakan params berikut:
-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
dan saya juga mengedit /etc/hosts
agar nama host memutuskan ke alamat host (192.168.0.x) daripada alamat loopback (127.0.0.1)
Jalankan aplikasi java Anda dengan parameter baris perintah berikut:
-Dcom.sun.management.jmxremote.port=8855
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Penting untuk menggunakan -Dcom.sun.management.jmxremote.ssl = parameter salah jika Anda tidak ingin mengatur sertifikat digital pada host jmx.
Jika Anda memulai aplikasi pada mesin yang memiliki alamat IP 192.168.0.1 , buka jconsole , masukkan 192.168.0.1:8855 di bidang Proses Jarak Jauh , dan klik Connect .
-Dcom.sun.management.jmxremote.ssl=false
? Haruskah jconsole
menunjukkan kesalahan, atau apakah hanya diam-diam gagal terhubung?
bersama dengan parameter baris perintah di bawah ini,
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Terkadang di server linux, koneksi IMX tidak berhasil. itu karena, di cloud linux host, di / etc / hosts sehingga nama host diselesaikan ke alamat host.
cara terbaik untuk memperbaikinya adalah, ping server linux tertentu dari mesin lain di jaringan dan gunakan alamat IP host tersebut di
-Djava.rmi.server.hostname=IP address that obtained when you ping that linux server.
Tapi jangan pernah mengandalkan ipaddress yang Anda dapatkan dari server linux menggunakan ifconfig.me. ip yang Anda dapatkan di sana adalah salah satu yang ada di file host.
Pertama, Anda perlu memeriksa apakah proses java Anda sudah berjalan dengan parameter JMX. Melakukan hal ini:
ps -ef | grep java
Periksa proses java Anda, Anda perlu memonitor. Jika Anda dapat melihat jmx rmi parameter Djmx.rmi.registry.port = xxxx kemudian gunakan port yang disebutkan di sini di java visualvm Anda untuk menghubungkannya dari jarak jauh di bawah koneksi jmx.
Jika tidak berjalan melalui port rm jmx maka Anda perlu menjalankan proses java Anda dengan parameter yang disebutkan di bawah ini:
-Djmx.rmi.registry.port=1234 -Djmx.rmi.port=1235 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
Catatan: nomor port didasarkan pada pilihan Anda.
Sekarang Anda dapat menggunakan port ini untuk koneksi jmx. Ini dia port 1234
.
sudo lsof -i:1234
tidak menunjukkan apa pun untuk saya
Langkah 1: Jalankan aplikasi menggunakan parameter berikut.
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Argumen di atas mengikat aplikasi ke port 9999.
Langkah 2: Luncurkan jconsole dengan menjalankan perintah jconsole di command prompt atau terminal.
Pilih 'Remote Process:' dan masukkan url sebagai {IP_Address}: 9999 dan klik tombol Connect untuk menghubungkan ke aplikasi jarak jauh.
Anda dapat merujuk tautan ini untuk aplikasi lengkap.
Saya memiliki masalah yang tepat ini, dan membuat proyek GitHub untuk menguji dan mencari tahu pengaturan yang benar .
Ini berisi bekerja Dockerfile
dengan skrip pendukung, dan sederhana docker-compose.yml
untuk pengujian cepat.