128

したがって、リモート ボックスで jmap を使用してヒープを見ており、その上でガベージ コレクションを強制したいと考えています。jvisualvm または jconsole や友人に飛び込むことなくこれを行うにはどうすればよいですか?

ガベージコレクションを強制するべきではないことはわかっています.ヒープが大きく/成長している理由を理解する必要があります。

また、System.GC() が実際にガベージ コレクションを強制するわけではないことも認識しています。これは、GC に発生させたいことを伝えるだけです。

そうは言っても、これを簡単に行う方法はありますか?不足しているコマンドラインアプリはありますか?

4

12 に答える 12

386

JDK 7 以降では、次のような JDK コマンド ツール「jcmd」を使用できます。

jcmd <pid> GC.run

于 2014-01-15T14:10:44.210 に答える
107

を実行するjmap -histo:live <pid>と、何かを出力する前にヒープで完全な GC が強制されます。

于 2010-08-19T16:39:45.023 に答える
26

これは、無料のjmxtermプログラムを使用して実行できます。

次のように起動します。

java -jar jmxterm-1.0-alpha-4-uber.jar

そこから、ホストに接続して GC をトリガーできます。

$>open host:jmxport
#Connection to host:jmxport is opened
$>bean java.lang:type=Memory
#bean is set to java.lang:type=Memory
$>run gc
#calling operation gc of mbean java.lang:type=Memory
#operation returns: 
null
$>quit
#bye

これを bash/perl/ruby/other スクリプトに埋め込む方法については、jmxterm Web サイトのドキュメントを参照してください。これを行うために、Python では popen2 を、Perl では open3 を使用しました。

更新: jmxterm を使用したワンライナーは次のとおりです。

echo run -b java.lang:type=Memory gc | java -jar jmxterm-1.0-alpha-4-uber.jar -n -l host:port
于 2010-08-19T16:33:06.277 に答える
7

他にもいくつかの解決策があります (既に多くの優れた解決策があります)。

  • MemoryMBeanにアクセスしてを呼び出す小さなコードを記述しますgc()
  • コマンドライン JMX クライアント ( cmdline-jmxclientjxmterm など) を使用gc()して、MemoryMBean で操作を実行します。

次の例は、cmdline-jmxclient の場合です。

$ java -jar cmdline-jmxclient-0.10.3.jar - localhost:3812 'java.lang:type=Memory' gc

これはたった 1 行であり、非常に簡単にスクリプトに入れることができるので便利です。

于 2010-08-19T16:37:27.437 に答える
1

同じコマンドラインオプションはないと思います。

同じために jvisualvm/jconsole を使用する必要があります。

これらのツールを使用して、プログラムのメモリが多い理由を特定することをお勧めします。

とにかく、GC を強制するべきではありません。GC アルゴリズムを妨害し、プログラムを遅くすることは間違いありません。

于 2010-08-19T16:30:05.683 に答える
0

複数のプロセスに対して、以下のように jcmd で GNU 並列を使用することを検討してください。

parallel 'jcmd {} GC.run' ::: $(pgrep java)

于 2021-04-06T04:00:46.067 に答える
-15

ただ:

kill -SIGQUIT <PID>
于 2013-01-17T03:05:49.403 に答える