web-dev-qa-db-ja.com

Windowsサービスとして実行され、レジストリからJVMパラメータをロードしているアクティブなJVMのヒープサイズの起動引数を確認するにはどうすればよいですか?

Windowsサービスとして実行されるサードパーティアプリケーションを搭載したWindowsサーバーがあります。サービス/アプリケーションは実際にはJava仮想マシンですが、タスクマネージャーではexeとして表示されます(foo.exeと呼びましょう)。

プログラムがレジストリからJVMヒープサイズ割り当て設定を取得するように設計されていること、およびレジストリ内のどこでその情報を検索しているかを知っています。そうは言っても、管理者がサービスを開始する前(または後に)にレジストリを編集したかどうかはわかりません。

これは本番システムであるため、サービスを再起動するのは気が進まない(特に、現在レジストリに表示されているヒープ割り当て値をすでに使用している場合)。サービスを再起動せずに伝えることができる他の方法はありますか?タスクマネージャで現在使用されているメモリを確認できると思いますが、正確な値は提供されません。

3
Mike B

タスクマネージャーにコマンドライン列を表示します。これには、コマンドラインで渡されたと想定した設定が含まれている必要があります。

task manager

2
Shane Madden

以下の回答mightではJMXを有効にする必要があることに注意してください-パブリックJREではデフォルトで無効になっていると思いますが、変更するにはJVMを再起動する必要があります、あなたの場合はかなり役に立たないでしょう。それでも、一撃の価値はありますか?

それらが機能するかどうかは、このアプリケーションで使用される特定のネイティブラッピング方法にも依存します。

これらのツールをjli.dllとともに、マイナーバージョンとアーキテクチャが一致するJDKから実行中のJREにコピーできるはずです。ツールをリモートで実行することもできますが、リモート接続のセキュリティ要件のため、初期設定なしでは機能しない可能性があります。


jps ツールはJDKで利用可能であり、コマンドjps -vでこの情報を提供できるはずです。複数のJavaプロセスを実行している場合は、最初の列のPIDでそれらを識別できます。

Netbeans(PID 9056)での出力例(アプリケーションと同様のネイティブラッパーを使用):

9056  -Dnetbeans.importclass=org.netbeans.upgrade.AutoUpgrade -Dnetbeans.accept_
license_class=org.netbeans.license.AcceptLicense -client -Xss2m -Xms32m -XX:Perm
Size=32m -Dapple.laf.useScreenMenuBar=true -Dapple.awt.graphics.UseQuartz=true -
Dsun.Java2d.noddraw=true -Dsun.Java2d.dpiaware=true -Dsun.Zip.disableMemoryMappi
ng=true -Xmx1024m <snip>

-Xss-Xms、および-Xmx引数に注意してください。


試すことができるもう1つのことは、 jinfo です。これにより、特定のPIDをターゲットにすることができます。 jinfo 9056

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


jconsolejvisualvmを試すこともできますが、私のテストでは、ラップされたJVMにアタッチして、VM引数をリストするのに問題があるようです。

2
Bob

「C:\ ProgramFiles(x86)\ Foo Vender」の下で、文字列-Xmsおよび-Xmxを含むテキストファイルを探します。INIから値を取得している可能性があります。ファイル。存在しない場合は、ご想像のとおり、おそらくどこかのレジストリから取得しています。私のクライアントの1つは、Windowsサービスとして実行されるWebプロキシを使用し、インストールしたregキーからスタートアップパラメーターを取得します。

EXEの起動時に読み取られているファイルまたはレジストリキーを正確に確認する場合は、サービスの開始時にSysinternalsのProcMonを使用してください。

1
mfinni