4

Bashでは、コマンドを使用java -Xmx8192m -Xms512m -jar jarfileして、初期ヒープスペースが512MB、最大ヒープスペースが8GBのJavaプロセスを開始します。

ヒープスペースが需要に応じて増加する方法が好きですが、ヒープスペースが増加すると、プロセスはメモリを必要としませんが、ヒープスペースは解放されません。プロセスで使用されていないメモリを解放するにはどうすればよいですか?

例:プロセスが開始され、600MBのメモリを使用します。ヒープスペースが512MBから600MB強に増加します。その後、プロセスは400MBのRAM使用量に低下しますが、ヒープ割り当ては600MBのままです。割り当てをRAM使用量の近くに保つにはどうすればよいですか?

4

3 に答える 3

6

それはいけません; それは単にそのように機能するように設計されていません。未使用のメモリページはハードウェアによって単純にマップされるため、実際のメモリを消費しないことに注意してください。

于 2012-07-11T18:44:25.033 に答える
4

どちらの操作もそれほど安価ではないため、通常、JVMがメモリをOSに戻し、後で要求することは望ましくありません。

XX好みのガベージコレクターで機能する場合と機能しない場合があるパラメーターがいくつかあります。

  • -XX:MaxHeapFreeRatio=70 縮小を回避するためのGC後のヒープフリーの最大パーセンテージ。
  • -XX:MinHeapFreeRatio=40 拡張を回避するためのGC後のヒープフリーの最小パーセンテージ。

ソース

彼らが強制されるためには、あなたは世界のコレクターを止める必要があると私は信じています。他のJVMには、独自のパラメーターがある場合があります。

私は通常は返信していませんが、否定的/偽の情報の量はクールではありません。

于 2012-07-11T19:26:41.937 に答える
1

いいえ、必須の機能です。AndroidのJVMはおそらくこれを実行できると思いますが、よくわかりません。

しかし、それらのほとんど(すべてのJava EE VMを含む)は、単にこれに関心がありません。

これは、見た目ほど単純ではありません。VMはOSビューからのプロセスであり、スタックまたはデータセグメントであるマップされたメモリ領域がどこかにあります。

ほとんどの場合、それは連続的な間隔である必要があります。メモリの割り当てとOSビューからの解放は、プロセスがOSに新しいセグメント制限を要求するために使用するシステムコールで発生します。

たとえば、JVMに2ギガバイトのRAMがあり、500メガバイトしか使用していないが、この500メガバイトがこの2ギガバイトの10バイトのフラグメントに分散している場合はどうすればよいでしょうか。このメモリ解放機能には、最適化ステップも必要です。これにより、GC実行のリソースコストが増加します。

Javaが実行され、Javaオブジェクトがガベージコレクタによって構築および破棄されると、空きおよび割り当てられたメモリ領域がスタック/データセグメントに分散されます。

Javaは表示されないが、ネイティブOSプロセスが表示される場合、状況は同じです。malloc()10個の1megブロックを実行し、最初の9個をリリースすると、新しいライブラリではありますが、OSに戻す方法はありません。そしてosapisはこれについて広範囲にわたる開発を行っています。もちろん、後でメモリを再度割り当てる場合、この割り当ては解放されたばかりの領域から行われます。

私の意見では、これは少しコストがかかり複雑(そして非常に大規模なプログラミング作業)であっても、その価格に見合う価値があり、私たちの集合的なプログラミング文化からの最高のイメージではないと思います。何十年にもわたって行われ、JavaVMが含まれています。

于 2013-01-04T20:06:06.173 に答える