実行中の Java プログラムからヒープ サイズを設定する方法はありますか?
7 に答える
いいえ。
ヒープ要件が非常に変動するアプリでできることは、ヒープが縮小したときにアプリが大量のメモリにハングアップしないように、最大ヒープ サイズを非常に高く設定して-Xmx
調整することです (デフォルト設定で実行されます)。 )。-XX:MaxHeapFreeRatio
-XX:MinHeapFreeRatio
ただし、アプリが実際に使用するメモリが大きく急速に変化する場合、これによりパフォーマンスの問題が発生する可能性があることに注意してください。 1秒後にもう一度。また、GC オプションをいじって、GC が要求されていないオブジェクトを置きすぎないようにすることもできます。これは、ヒープが大きくなる余地がたくさんある場合に発生する傾向があり、次の目標を無効にする可能性があります。アプリのニーズに合わせてヒープ サイズを調整する必要があります。
http://www.dreamincode.net/forums/showtopic96263.htmによると、実行時にこれを行うことはできませんが、別のヒープ サイズで別のプロセスを生成することはできます。
アプリケーションの起動時にこれらの設定を微調整できますが、JVM が起動して実行されると、これらの値を変更することはできません。このようなもの:
java -Xms32m -Xmx512m FooBar
最小ヒープ サイズを 32MB に、最大ヒープ サイズを 512MB に設定します。これらが設定されると、実行中のプログラム内で変更することはできません。
確かにこれは不可能だというのがコンセンサスかもしれませんが、JVM ソースを調べて、人間工学的にどのように制御できるかを確認する必要があります。JVMTI エージェントがヒープ/perm/tenured/new/&c のサイズをオンライン/実行時に調整できるようにできると非常に便利です。
これは何をしますか?JVM をクラウドに移行する際に重要となる、パフォーマンスまたはフットプリントの目標に基づいて、エージェントがサイジング調整を推測できるようになります。
起動時に-mxオプションを使用できます( -Xmxとも呼ばれます)。
ただし、回避策として、main() で最大サイズをチェックし、最大サイズが希望どおりでない場合は Java を再起動します。つまり、別の Java プログラムを開始して終了します。
私は自分自身に同じ質問をしました。上記の回答とは異なり、アプリで最大ヒープ JVM サイズを増やすことについてできることがあります。アプリがクラスター モードの Web サーバーである場合、最小/最大ヒープ サイズを変更して新しいインスタンスを開始し、最初のインスタンスをシャットダウンすることができます。これは、nodeAgent (アプリケーションサーバーのクラスター化されたインスタンス) JVM から分離された管理インスタンスがある GlassFish では特に簡単です。
多くの JVM アプリケーションは Web アプリケーションであるため、このブログに残しておく価値があると思います。