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.
Jawaban:
Anda bisa menggunakan jps seperti
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
sumber
jps -lvm
mungkin 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 menggunakanjava -jar my.jar -Xmx3g
alih-alihjava -Xmx3g -jar my.jar
Saya menambahkan jawaban baru ini karena sesuai dengan dokumentasi JDK8, jcmd adalah pendekatan yang disarankan sekarang.
Di bawah ini adalah perintah untuk mendapatkan properti / bendera yang Anda inginkan.
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
sumber
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/
sumber
Alternatifnya, Anda bisa menggunakan jinfo
sumber
-flags
opsi tidak ada di OpenJDK 64-Bit Server VM (build 1.8.0_111-internal-alpine-r0-b14) (java:8u111-jdk-alpine
image Docker saat ini )flags
bekerja dengan image java Docker resmi berdasarkan Debian Jessiedocker run --rm -it java:8u111-jdk java -version && jinfo -h
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); }
sumber
JConsole bisa melakukannya. Anda juga dapat menggunakan alat jvisualVM yang kuat, yang juga disertakan dalam JDK sejak 1.6.0.8.
sumber
Di linux, Anda dapat menjalankan perintah ini dan melihat hasilnya:
ps aux | grep "java"
sumber
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).
sumber
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.
sumber
Anda dapat menggunakan perintah JConsole (atau klien JMX lainnya) untuk mengakses informasi itu.
sumber
Teknik ini berlaku untuk aplikasi java apa pun yang berjalan secara lokal atau jarak jauh.
jvisualvm dapat ditemukan di JDK mana pun sejak Pembaruan JDK 6 7. Video tutorial tentang jvisualvm ada di sini.
sumber
_JAVA_OPTIONS adalah variabel env yang dapat diperluas.
sumber