9

JVM 1.5.0 (Mac OS X デフォルト) を実行しており、アクティビティ モニターで Java プログラムを監視しています。私は次のものを持っています:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;

public class MemoryTest {

public static void memoryUsage() {
 System.out.println(
     Runtime.getRuntime().totalMemory() - 
     Runtime.getRuntime().freeMemory()
 );
}

public static void main( String[] args ) throws IOException {

    /* create a list */
    ArrayList<Date> list = new ArrayList<Date>();

    /* fill it with lots of data */
    for ( int i = 0; i < 5000000; i++ ) {
        list.add( new Date() );
    } // systems shows ~164 MB of physical being used

    /* clear it */
    memoryUsage();      //  about 154 MB
    list.clear();
    list = null;
    System.gc();
    memoryUsage();      //  about 151 KB, garbage collector worked

    // system still shows 164 MB of physical being used.
    System.out.println("Press enter to end...");
    BufferedReader br = new BufferedReader( 
            new InputStreamReader( System.in )
            );
    br.readLine();
}

}

では、ガベージ コレクターが正常に動作しているように見えても、物理メモリが解放されないのはなぜでしょうか。

4

4 に答える 4

19

多くの JVM はオペレーティング システムにメモリを返しません。そうするかどうかは、実装固有です。そうでない場合は、起動時に (通常は -Xmx フラグを使用して) 指定されたメモリ制限が、他のアプリケーション用にメモリを確保するための主要な手段になります。

この件に関するドキュメントを見つけるのに苦労していますが、Sun の Java 5 のガベージ コレクターのドキュメントはこれに対処しており、適切な条件下で、正しいコレクターが使用された場合 (デフォルトでは 70 を超える場合)、ヒープが縮小することを示唆しています。ヒープの % が空いている場合、40% だけが空いているように縮小されます。これらを制御するコマンド ライン オプションは-XX:MinHeapFreeRatio、 と-XX:MaxHeapFreeRatioです。

于 2008-11-27T19:16:01.903 に答える
5

Java が使用するヒープのサイズを調整するのに役立つ、JVM 用のコマンド ライン オプションがいくつかあります。ヒープの最小サイズと最大サイズを設定する -Xms と -Xmx については誰もが知っています (または知っておく必要があります)。

ただし、-XX:MinHeapFreeRatio と -XX:MaxHeapFreeRatio もあり、これらは JVM が空き領域を管理するそれぞれの制限です。使用されているヒープを縮小することでこれを行い、プログラムのメモリ消費量を減らすことができます。

詳細については、次を参照してください。

于 2008-11-27T19:39:19.283 に答える
3

JVM に割り当てられたメモリではなく、プログラムによって使用されている実際のヒープ領域を監視するには、JVM 固有のプロファイラーを使用する必要があります。

JVM は、割り当てたヒープ メモリの解放をためらうだけでなく、ジャスト イン タイム コンパイルなどのさまざまな理由でスペースをむさぼり食う傾向があります。

于 2008-11-27T19:27:45.297 に答える
0

OS は、現在プログラムに割り当てられているメモリを表示している可能性があります。150 ~ MB が割り当てられていても、150 ~ MB が使用されているわけではありません。

于 2008-11-27T19:16:51.463 に答える