Mendapatkan parameter JVM yang sedang berjalan

90

Apakah ada cara untuk mendapatkan parameter JVM yang sedang berjalan? Apakah ada alat baris perintah seperti jstat yang mengambil pid dari JVM dan mengembalikan parameter awalnya? Saya sangat tertarik dengan nilai -Xmx dan -Xms yang diberikan saat memulai JVM. Terima kasih.

Edit : Untuk memperjelas kendala saya. JVM yang ingin kami periksa berjalan di server produksi. Karena itu, kami lebih memilih gangguan minimal. Kami dapat memantau JVM menggunakan jstat, jadi kami berharap ada solusi sederhana serupa untuk mengakses parameter.

Sunting : Kami juga mencoba mendapatkan parameter menggunakan jvisualvm. Tetapi untuk terhubung ke jvm jarak jauh, kita perlu menjalankan jstatd dan mengubah pengaturan keamanan JVM, yang menurut kami sangat mengganggu dan berisiko pada server produksi.

HH
sumber
Anda dapat menemukan alat di sana: JDK Tools and Utilities
Guillaume Husta

Jawaban:

145

Anda bisa menggunakan jps seperti

jps -lvm

mencetak sesuatu seperti

4050 com.intellij.idea.Main -Xms128m -Xmx512m -XX:MaxPermSize=250m -ea -Xbootclasspath/a:../lib/boot.jar -Djb.restart.code=88
4667 sun.tools.jps.Jps -lvm -Dapplication.home=/opt/java/jdk1.6.0_22 -Xms8m
Peter Lawrey
sumber
6
Bekerja seperti pesona. Saya juga menemukan alat jinfo di jdk yang memiliki fungsi serupa
HH
2
Perhatikan bahwa keluaran dari jps -lvmmungkin menyesatkan. Selalu periksa kembali dengan jinfo atau alat lainnya. Masalahnya bisa jadi jika "-XX" dilewatkan seperti argumen program normal dan diabaikan oleh JVM. Ini adalah kasus jika Anda menggunakan java -jar my.jar -Xmx3galih-alihjava -Xmx3g -jar my.jar
Juraj Martinka
36

Saya menambahkan jawaban baru ini karena sesuai dengan dokumentasi JDK8, jcmd adalah pendekatan yang disarankan sekarang.

Disarankan untuk menggunakan utilitas terbaru, jcmd daripada utilitas jstack, jinfo, dan jmap sebelumnya untuk meningkatkan diagnostik dan mengurangi overhead kinerja.

Di bawah ini adalah perintah untuk mendapatkan properti / bendera yang Anda inginkan.

jcmd pid VM.system_properties
jcmd pid VM.flags

Kami membutuhkan pid, untuk ini gunakan jcmd -l, seperti di bawah ini

username@users-Air:~/javacode$ jcmd -l 
11441 Test 
6294 Test 
29197 jdk.jcmd/sun.tools.jcmd.JCmd -l 

Sekarang saatnya menggunakan pids ini untuk mendapatkan properti / flag yang Anda inginkan

Perintah: jcmd 11441 VM.system_properties

11441:
#Tue Oct 17 12:44:50 IST 2017
gopherProxySet=false
awt.toolkit=sun.lwawt.macosx.LWCToolkit
file.encoding.pkg=sun.io
java.specification.version=9
sun.cpu.isalist=
sun.jnu.encoding=UTF-8
java.class.path=.
java.vm.vendor=Oracle Corporation
sun.arch.data.model=64
java.vendor.url=http\://java.oracle.com/
user.timezone=Asia/Kolkata
java.vm.specification.version=9
os.name=Mac OS X
sun.java.launcher=SUN_STANDARD
user.country=US
sun.boot.library.path=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/lib
sun.java.command=Test
http.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
jdk.debug=release
sun.cpu.endian=little
user.home=/Users/XXXX
user.language=en
java.specification.vendor=Oracle Corporation
java.home=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home
file.separator=/
java.vm.compressedOopsMode=Zero based
line.separator=\n
java.specification.name=Java Platform API Specification
java.vm.specification.vendor=Oracle Corporation
java.awt.graphicsenv=sun.awt.CGraphicsEnvironment
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
ftp.nonProxyHosts=local|*.local|169.254/16|*.169.254/16
java.runtime.version=9+181
user.name=XXXX
path.separator=\:
os.version=10.12.6
java.runtime.name=Java(TM) SE Runtime Environment
file.encoding=UTF-8
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
java.vendor.url.bug=http\://bugreport.java.com/bugreport/
java.io.tmpdir=/var/folders/dm/gd6lc90d0hg220lzw_m7krr00000gn/T/
java.version=9
user.dir=/Users/XXXX/javacode
os.arch=x86_64
java.vm.specification.name=Java Virtual Machine Specification
java.awt.printerjob=sun.lwawt.macosx.CPrinterJob
sun.os.patch.level=unknown
MyParam=2
java.library.path=/Users/XXXX/Library/Java/Extensions\:/Library/Java/Extensions\:/Network/Library/Java/Extensions\:/System/Library/Java/Extensions\:/usr/lib/java\:.
java.vm.info=mixed mode
java.vendor=Oracle Corporation
java.vm.version=9+181
sun.io.unicode.encoding=UnicodeBig
java.class.version=53.0
socksNonProxyHosts=local|*.local|169.254/16|*.169.254/16

Perintah: jcmd 11441 VM.flags keluaran:

11441:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1ConcRefinementThreads=4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=67108864 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 -XX:NonNMethodCodeHeapSize=5830092 -XX:NonProfiledCodeHeapSize=122914074 -XX:ProfiledCodeHeapSize=122914074 -XX:ReservedCodeCacheSize=251658240 -XX:+SegmentedCodeCache -XX:-UseAOT -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

Untuk instruksi lebih lanjut tentang penggunaan jcmd, lihat posting blog saya

Vipin
sumber
Tidak dapat menemukan proses yang cocok: 'pid'
Ch Vas
1
pid harus diganti dengan id proses java, os Linux umumnya kita dapatkan dengan “ps -ef | grep jdk ”, jika Anda melihat beberapa proses oleh ini, ajukan pertanyaan baru atau coba google
Vipin
23

Di Linux:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Di Mac OSX:

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

Di Windows:

C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

Sumber: https://www.mkyong.com/java/find-out-your-java-heap-memory-size/

Diego López
sumber
21

Alternatifnya, Anda bisa menggunakan jinfo

jinfo -flags <vmid> 
jinfo -sysprops <vmid>
Jarek Przygódzki
sumber
3
Utilitas ini tidak didukung dan mungkin atau mungkin tidak tersedia di versi JDK mendatang.
GoYun.Info
-flagsopsi tidak ada di OpenJDK 64-Bit Server VM (build 1.8.0_111-internal-alpine-r0-b14) ( java:8u111-jdk-alpineimage Docker saat ini )
Anthony O.
Saya menulis jawaban ini dengan mempertimbangkan Java 6/7. Di luar itu jinfo tidak dapat diandalkan, tetapi flagsbekerja dengan image java Docker resmi berdasarkan Debian Jessie docker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki
15

Jika Anda dapat melakukan ini di java, coba:

RuntimeMXBean

ManagementFactory

Contoh:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}
lukastymo
sumber
1
Hanya akan memberikan nilai jika dilewatkan, maka tidak ada pengaturan default.
Behe
8

JConsole bisa melakukannya. Anda juga dapat menggunakan alat jvisualVM yang kuat, yang juga disertakan dalam JDK sejak 1.6.0.8.

Vladimir Ivanov
sumber
3

Di linux, Anda dapat menjalankan perintah ini dan melihat hasilnya:

ps aux | grep "java"
Etienne
sumber
Perusahaan saya menggunakan Red Hat Linux dan saya memiliki akses yang sangat terbatas ke sistem. ps aux | grep "java" perintah mendaftar semua perintah java dengan argumen jvm mereka dan kami bahkan dapat grep argumen jvm yang tepat jika diperlukan. Ini sangat berguna jika alat lain seperti jps, jcmd dll tidak tersedia / dapat diakses.
AGan
1

Windows 10 atau Windows Server 2016 menyediakan informasi tersebut di pengelola tugas standar mereka. Kasus yang jarang terjadi untuk produksi, tetapi jika JVM target berjalan di Windows, cara termudah untuk melihat parameternya adalah dengan menekan Ctrl + Alt + Delete, pilih tab Proses dan tambahkan kolom baris Perintah (dengan mengklik tombol kanan mouse pada tajuk kolom apa pun yang ada).

Roman Khomyshynets
sumber
1

Jika Anda tertarik untuk mendapatkan parameter JVM dari proses java yang sedang berjalan, lakukan kill -3 java-pid. Anda akan mendapatkan file dump inti di mana Anda dapat menemukan parameter jvm yang digunakan saat meluncurkan aplikasi java.

lambzee.dll
sumber
0

Anda dapat menggunakan perintah JConsole (atau klien JMX lainnya) untuk mengakses informasi itu.

nfechner.dll
sumber
0

Teknik ini berlaku untuk aplikasi java apa pun yang berjalan secara lokal atau jarak jauh.

  1. Mulai aplikasi java Anda.
  2. Jalankan JVisualVM yang ditemukan di JDK Anda (seperti C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe).
  3. Ketika alat yang berguna ini mulai, lihat daftar menjalankan aplikasi java di bawah simpul pohon "Lokal".
  4. Klik dua kali [aplikasi Anda] (pid [n]).
  5. Di sisi kanan akan ada konten pemeriksaan di tab untuk aplikasi. Di tengah tab Ikhtisar, Anda akan melihat argumen JVM untuk aplikasi tersebut.

jvisualvm dapat ditemukan di JDK mana pun sejak Pembaruan JDK 6 7. Video tutorial tentang jvisualvm ada di sini.

javajon.dll
sumber
OP secara eksplisit menyatakan bahwa jvisualvm bukanlah pilihan.
Olivier Gérardin
0

_JAVA_OPTIONS adalah variabel env yang dapat diperluas.

echo $_JAVA_OPTIONS
zee
sumber