実行中のJVMのパラメーターの取得


90

実行中のJVMのパラメーターを取得する方法はありますか?JVMのpidを入力として受け取り、その開始パラメーターを返すjstatのようなコマンドラインツールはありますか?特に、JVMの起動時に指定された-Xmx値と-Xms値に関心があります。ありがとうございました。

編集:私の制約を明確にするため。確認したいJVMは本番サーバーで実行されています。そのため、中断を最小限に抑えることをお勧めします。jstatを使用してJVMを監視できるため、パラメーターにアクセスするための同様の簡単なソリューションがあることを願っています。

編集:jvisualvmを使用してパラメーターを取得しようとしました。ただし、リモートjvmに接続するには、jstatdを実行し、JVMのセキュリティ設定を変更する必要があります。これは、運用サーバーでは非常に混乱を招き、リスクが高いことがわかりました。


そこにツールがあります:JDK Tools and Utilities
Guillaume Husta 2017

回答:


145

あなたはのようなjpsを使うことができます

jps -lvm

次のようなものを印刷します

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
チャームのように機能します。同様の機能を持つjdkのjinfoツールも発見しました
HH

2
の出力はjps -lvm誤解を招く可能性があることに注意してください。常にjinfoまたは他のツールで再確認してください。問題は、「-XX」が通常のプログラム引数のように渡され、JVMによって無視される場合に発生する可能性があります。これは、java -jar my.jar -Xmx3g代わりに使用する場合にjava -Xmx3g -jar my.jar
当てはまり

36

JDK8のドキュメントに従って、jcmdが提案されているアプローチであるため、この新しい回答を追加します。

診断を強化し、パフォーマンスのオーバーヘッドを削減するために、以前のjstack、jinfo、およびjmapユーティリティの代わりに最新のユーティリティjcmdを使用することをお勧めします。

以下は、必要なプロパティ/フラグを取得するためのコマンドです。

jcmd pid VM.system_properties
jcmd pid VM.flags

pidが必要です。このためには、以下のようにjcmd-lを使用します。

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

次に、これらのpidを使用して、必要なプロパティ/フラグを取得します。

コマンド: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

コマンド:jcmd 11441 VM.flags出力:

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の使用方法の詳細については、私のブログ投稿を参照しください。


一致するプロセスが見つかりませんでした: 'pid'
Ch Vas 2018

1
pidはjavaプロセスIDに置き換える必要があります。LinuxOSは通常、「ps -ef | grep jdk」、これによって複数のプロセスが表示された場合は、新しい質問をするか、グーグルで
検索して


21

または、jinfoを使用することもできます

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

3
このユーティリティはサポートされておらず、JDKの将来のバージョンで使用できる場合とできない場合があります。
GoYun.Info 2016年

-flagsオプションはOpenJDK64ビットサーバーVM(ビルド1.8.0_111-internal-alpine-r0-b14)(現在のjava:8u111-jdk-alpineDockerイメージ)には存在しません
Anthony O.

私はJava6 / 7を念頭に置いてこの答えを書きました。Jinfoのは信頼できないですが、それを超えてflagsのDebianジェシーに基づく公式ドッカーのJava画像で動作します docker run --rm -it java:8u111-jdk java -version && jinfo -h
JarekPrzygódzki

15

Javaでこれを実行できる場合は、次を試してください。

RuntimeMXBean

ManagementFactory

例:

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

1
渡された場合にのみ値を提供するため、デフォルト設定はありません。
Behe 2016


3

Linuxでは、このコマンドを実行して結果を確認できます。

ps aux | grep "java"

私の会社はRedHat Linuxを使用しており、システムへのアクセスは非常に制限されています。ps aux | grep "java"コマンドは、すべてのjavaコマンドとそのjvm引数を一覧表示し、必要に応じて正確なjvm引数をgrepすることもできます。これは、jps、jcmdなどの他のツールが利用できない/アクセスできない場合に非常に役立ちます。
AGan

1

Windows10またはWindowsServer 2016は、標準のタスクマネージャーでそのような情報を提供します。本番環境ではまれなケースですが、ターゲットJVMがWindowsで実行されている場合、そのパラメーターを確認する最も簡単な方法は、Ctrl + Alt + Deleteを押し、[プロセス]タブを選択し、コマンドライン列を追加することです(マウスの右ボタンをクリックして既存の列ヘッダー)。


1

実行中のJavaプロセスのJVMパラメータを取得することに興味がある場合は、kill -3java-pidを実行してください。Javaアプリケーションの起動中に使用されたjvmパラメーターを見つけることができるコアダンプファイルを取得します。


0

JConsoleコマンド(またはその他のJMXクライアント)を使用して、その情報にアクセスできます。


0

この手法は、ローカルまたはリモートで実行されているすべてのJavaアプリケーションに適用されます。

  1. Javaアプリケーションを起動します。
  2. JVisualVMを実行するあなたの中に見つかったJDK(例えばC:\プログラムファイル\のJava \ jdk1.8.0_05 \ binに\ jvisualvm.exe)。
  3. この便利なツールが起動したら、「ローカル」ツリーノードの下で実行中のJavaアプリケーションのリストを確認します。
  4. [アプリケーション](pid [n])をダブルクリックします。
  5. 右側には、アプリケーションのタブに検査内容が表示されます。[概要]タブの中央に、アプリケーションのJVM引数が表示されます。

jvisualvmは、JDK 6 Update 7以降のすべてのJDKにあります。jvisualvmのビデオチュートリアルは、こちらです。


OPは、jvisualvmはオプションではないと明示的に述べました。
オリヴィエGérardin

0

_JAVA_OPTIONSは、展開可能な環境変数です。

echo $_JAVA_OPTIONS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.