web-dev-qa-db-ja.com

実行時のJVMヒープサイズの設定

実行中のJavaプログラムからヒープサイズを設定する方法はありますか?

59
feiroox

番号。

ヒープ要件が非常に変動するアプリでできることは、-Xmxで最大ヒープサイズを非常に大きく設定し、-XX:MaxHeapFreeRatioおよび-XX:MinHeapFreeRatioを調整して、アプリがハングアップしないようにすることです。ヒープが縮小するときに大量のメモリ(デフォルト設定でそれを行います)。

ただし、アプリで実際に使用されるメモリが強くかつ迅速に変化する場合、これによりパフォーマンスの問題が発生する可能性があることに注意してください。もう一度。また、 GCオプション をいじって、GCがあまりにも多くの要求されていないオブジェクトを残さないようにすることもできます。また、ヒープサイズをアプリのニーズに合わせて調整するという目標を達成できません。

59

http://www.dreamincode.net/forums/showtopic96263.htm によれば、実行時にこれを行うことはできませんが、異なるヒープサイズで別のプロセスを生成できます。

13
thSoft

アプリケーションの起動時にこれらの設定を調整できますが、JVMが起動して実行されると、これらの値は変更できません。このようなもの:

Java -Xms32m -Xmx512m FooBar

最小ヒープサイズを32MBに、最大ヒープサイズを512MBに設定します。これらが設定されると、実行中のプログラム内で変更することはできません。

7
Andrew Hare

実際、これは不可能であるというコンセンサスかもしれませんが、人間工学的にどのように制御できるかを確認するには、JVMソースを調べる必要があります。 JVMTIエージェントがヒープ/パーマ/テニュアリング/新規/&cのサイズをオンライン/実行時に調整できるようにすることは非常に素晴らしいことです。

これは何をしますか? JVMをクラウドに移行する際に重要となるパフォーマンスまたはフットプリントの目標に基づいて、エージェントがサイズ調整を推測できるようにします。

2
Jé Queue

起動時に-mxオプションを使用できます(-Xmxとも呼ばれます)。これは、設定する必要のない最大サイズです。必要な最大サイズを超えています。

ただし、回避策は、main()で最大サイズをチェックし、最大サイズが希望どおりでない場合はJavaを再起動することです。つまり、別のJava =プログラムして死ぬ。

2
Peter Lawrey

私は自分自身に同じ質問をしました。上記の回答とは異なり、my appで最大ヒープJVMサイズを増やすことについてできることがあります。アプリがクラスターモードのWebサーバーである場合、最小/最大ヒープサイズを変更して新しいインスタンスを起動し、初期インスタンスをシャットダウンすることができます。これは、nodeAgent(app server clustered instance)JVMから分離された管理インスタンスがあるGlassFishで特に簡単です。

多くのJVMアプリケーションはWebアプリであるため、このブログで保護する価値があると思います。

0
Sasha Firsov