Çalışan bir JVM'nin parametrelerini alma


92

Çalışan bir JVM'nin parametrelerini almanın bir yolu var mı? JVM'nin pid'ini girdi olarak alan ve başlangıç ​​parametrelerini döndüren jstat gibi bir komut satırı aracı var mı? JVM'yi başlatırken verilen -Xmx ve -Xms değerleriyle özellikle ilgileniyorum. Teşekkür ederim.

Düzenleme : Kısıtlamalarımı netleştirmek için. Kontrol etmek istediğimiz JVM, bir üretim sunucusunda çalışıyor. Bu yüzden minimum kesintiyi tercih ediyoruz. JVM'yi jstat kullanarak izleyebiliyoruz ve bu nedenle, parametrelere erişmek için benzer basit bir çözüm olmasını umuyoruz.

Düzenleme : Parametreleri jvisualvm kullanarak da almaya çalıştık. Ancak uzak bir jvm'ye bağlanmak için, jstatd'yi çalıştırmamız ve bir üretim sunucusunda çok yıkıcı ve riskli bulduğumuz JVM'nin güvenlik ayarlarını değiştirmemiz gerekiyor.


Orada bir araç bulabilirsiniz: JDK Tools and Utilities
Guillaume Husta

Yanıtlar:


148

Jps gibi kullanabilirsiniz

jps -lvm

gibi bir şey yazdırır

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

6
Tıkır tıkır çalışıyor. Ayrıca jdk'de benzer bir işleve sahip jinfo aracını da keşfettim
HH

2
Sonucunun jps -lvmyanıltıcı olabileceğine dikkat edin . Her zaman jinfo veya başka bir araçla iki kez kontrol edin. Sorun "-XX" normal program argümanı gibi geçirilir ve JVM tarafından yok sayılırsa olabilir. Bunun java -jar my.jar -Xmx3gyerine kullanırsanız durum budurjava -Xmx3g -jar my.jar
Juraj Martinka

39

Bu yeni yanıtı ekliyorum çünkü JDK8 belgelerine göre jcmd şu anda önerilen yaklaşımdır.

Gelişmiş tanılama ve azaltılmış performans ek yükü için önceki jstack, jinfo ve jmap yardımcı programları yerine en son yardımcı program olan jcmd'nin kullanılması önerilir.

Aşağıda, istediğiniz özelliklerinizi / işaretlerinizi almak için komutlar verilmiştir.

jcmd pid VM.system_properties
jcmd pid VM.flags

Pid'e ihtiyacımız var, bu kullanım için jcmd -l, aşağıdaki gibi

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

Şimdi bu pid'leri istediğiniz özellikleri / bayrakları almak için kullanma zamanı

Komut: 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

Komut: jcmd 11441 VM.flags çıktısı:

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 

Jcmd kullanımıyla ilgili daha fazla talimat için blog gönderime bakın


Eşleşen işlem bulunamadı: 'pid'
Ch Vas

1
pid, java işlem kimliği ile değiştirilmelidir, Linux işletim sistemi genellikle "ps -ef | grep jdk ”, buna göre birden fazla işlem görürseniz, o zaman yeni bir soru sorun veya onu google'da
aramayı


22

Alternatif olarak jinfo kullanabilirsiniz

jinfo -flags <vmid> 
jinfo -sysprops <vmid>

3
Bu yardımcı program desteklenmemektedir ve JDK'nın gelecekteki sürümlerinde mevcut olabilir veya olmayabilir.
GoYun.Info

-flagsseçenek 64-bit sunucu VM (build 1.8.0_111-iç-alpin-r0-b14) (mevcut OpenJDK içinde yok java:8u111-jdk-alpineDocker görüntüsü)
Anthony O.

Bu cevabı Java 6/7 ile yazdım. Bu jinfo'nun ötesinde güvenilmez, ancak flagsDebian Jessiedocker run --rm -it java:8u111-jdk java -version && jinfo -h
Jarek Przygódzki'ye

16

Bunu java'da yapabiliyorsanız, şunu deneyin:

RuntimeMXBean

Yönetim Fabrikası

Misal:

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
List<String> jvmArgs = runtimeMXBean.getInputArguments();
for (String arg : jvmArgs) {
    System.out.println(arg);
}

1
Yalnızca geçirilmişse değerleri sağlar, dolayısıyla varsayılan ayarlar yoktur.
Behe

8

JConsole yapabilir. Ayrıca, 1.6.0.8'den beri JDK'da bulunan güçlü bir jvisualVM aracını da kullanabilirsiniz.


3

Linux'ta bu komutu çalıştırabilir ve sonucu görebilirsiniz:

ps aux | grep "java"

Şirketim Red Hat Linux kullanıyor ve sisteme çok sınırlı erişimim var. ps aux | grep "java" komutu tüm java komutlarını jvm argümanlarıyla birlikte listeler ve gerekirse tam jvm argümanını bile grep edebiliriz. Bu, jps, jcmd vb. Gibi diğer araçların mevcut / erişilebilir olmaması durumunda gerçekten yararlıdır.
AGan

2

Windows 10 veya Windows Server 2016 bu tür bilgileri standart görev yöneticilerinde sağlar. Üretim için ender görülen bir durumdur, ancak hedef JVM Windows'ta çalışıyorsa, parametrelerini görmenin en basit yolu Ctrl + Alt + Delete tuşlarına basmak, İşlemler sekmesini seçmek ve Komut satırı sütununu eklemektir (sağ fare düğmesine tıklayarak herhangi bir sütun başlığı).


1

Çalışan bir java işleminin JVM parametrelerini almakla ilgileniyorsanız, -3 java-pid'i öldürün. Java uygulamasını başlatırken kullanılan jvm parametrelerini bulabileceğiniz bir çekirdek döküm dosyası alacaksınız.


0

Bu bilgilere erişmek için JConsole komutunu (veya başka bir JMX istemcisini) kullanabilirsiniz.


0

Bu teknik, yerel veya uzaktan çalışan herhangi bir java uygulaması için geçerlidir.

  1. Java uygulamanızı başlatın.
  2. JVisualVM'yi çalıştırın bulunan (C: \ Program Files \ Java \ jdk1.8.0_05 \ bin \ jvisualvm.exe gibi).
  3. Bu kullanışlı araç başladığında, "Yerel" ağaç düğümü altında çalışan java uygulamasının listesine bakın.
  4. [Uygulamanızı] (pid [n]) çift tıklayın.
  5. Sağ tarafta, uygulama sekmesinde inceleme içerikleri olacaktır. Genel Bakış sekmesinin ortasında, uygulamanın JVM bağımsız değişkenlerini göreceksiniz.

jvisualvm, JDK 6 Güncelleme 7'den bu yana herhangi bir JDK'da bulunabilir. jvisualvm ile ilgili video eğitimi burada.


OP, jvisualvm'nin bir seçenek olmadığını açıkça belirtti.
Olivier Gérardin

0

_JAVA_OPTIONS, genişletilebilen bir env değişkenidir.

echo $_JAVA_OPTIONS
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.