web-dev-qa-db-ja.com

Javaガベージコレクターを無効にする方法を教えてください。

PHP Webアプリケーションがあり、Javaバイナリを呼び出してPDFレポートを作成します(JasperReportsを使用)。 JavaバイナリはPDFを標準出力に出力して終了します。次にPHPがPDFをブラウザに送信します。このJavaコマンドは約3〜6秒続きます。6秒続くのは、GCが起動するためだと思います。コマンドが終了するとすべてのメモリが返されるため、GCを無効にしたいと思います。

Java 1.4.2とJava 1.6.0の両方を無効にする方法を知りたいのは、現在両方のJVMをテストしてどちらがより高速であるかを確認しているためです。

34
Nelson

ガベージコレクションを完全に無効にする方法はありません。ガベージコレクションは、JVMが領域を使い果たしたときにのみ実行されるため、プログラムにメモリを追加できます。これらのコマンドラインオプションをJavaコマンドに追加します

-Xmx256M -Xms256M

これにより、プログラムに256MbのRAMが与えられます(デフォルトは64Mbです)。ただし、デフォルトサイズのJVMの場合、ガベージコレクションには3秒はかかりません。そのため、プログラムが何を行っているかをより詳しく調査したい場合があります。 Yourkitプロファイラ は、何が時間がかかっているのかを把握するのに非常に役立ちます。

29
Ceilingfish

時間を節約しようとしているように見えますが、それを間違った方法で行っています。 Javaプロセスの起動とシャットダウンにかかる時間と比較して、ガベージコレクションを無効にすることで節約される時間は(単一のタスクの場合)は取るに足らないものです。Javaプロセスの起動。実行時のパフォーマンスが目標の場合、必要な作業を複数回依頼することができます。

37
Paul Jowett

GCは、JVMのメモリが不足している場合にのみ起動するため、GCまたはダイのいずれかになります。詳細GCをオンにして、実際にかなり時間がかかるかどうかを確認してください。

Java -verbose:gc
29
unbeli

Java 11には no-opガベージコレクター が付属しています。

-XX:+UseEpsilonGC JVM起動時のオプション。

JEPの説明 によると、その目標の1つは、特定の短期間のジョブをより効率的にすることです。

非常に短命な仕事。存続期間の短いジョブは、リソース(ヒープメモリなど)を解放するためにすぐに終了することに依存する場合があります。この場合、GCサイクルを受け入れてヒープを無駄にクリーンアップすることは、とにかく終了時にヒープが解放されるため、時間の無駄です。 GCサイクルはヒープ内のライブデータの量に依存するため、時間がかかる場合があることに注意してください。

11
aventurin

-Xmx最大ヒープサイズを設定するオプション。より大きなヒープを使用すると、VMがメモリを使い果たしてしまうのを防ぐことができるため、すぐにガベージコレクションが必要になります。

スローダウンの原因となっているガベージコレクションでよろしいですか?何が起こっているかを確認するために、Java -verbose:gcを指定して実行しましたか?

JVMのガベージコレクションを無効にすることはできません。ただし、パフォーマンスを向上させるために tuning ガベージコレクターを確認することもできます。

1
Mark