0

なんらかの理由で、作成してデータを入力できるオブジェクトの数を確認したかったのLinkedListです。以前Runtime.getRuntime().freeMemory()は、JVMの空きメモリの概算を取得していました。私はこれを書いた:

public static void main(String[] arg) {
    Scanner kb = new Scanner(System.in);
    List<Long> mem = new LinkedList<Long>();
    while (true) {
        System.out.println("Max memory: " + Runtime.getRuntime().maxMemory() + ". Available memory: " + Runtime.getRuntime().freeMemory() + " bytes. Press enter to use more.");
        String s = kb.nextLine();
        if (s.equals("m"))
        for (int i = 0; i < 1000000; i++) {
            mem.add(new Long(Long.MAX_VALUE));
        }
    }
}

を書き込むとm、アプリはリストに100万Long個のオブジェクトを追加します。オブジェクトが多いほど(参照があるため、gcすることはできません)、空きメモリが少なくなると思います。コードの実行:

Max memory: 1897725952. Available memory: 127257696 bytes.
m
Max memory: 1897725952. Available memory: 108426520 bytes.
m
Max memory: 1897725952. Available memory: 139873296 bytes.
m
Max memory: 1897725952. Available memory: 210632232 bytes.
m
Max memory: 1897725952. Available memory: 137268792 bytes.
m
Max memory: 1897725952. Available memory: 239504784 bytes.
m
Max memory: 1897725952. Available memory: 169507792 bytes.
m
Max memory: 1897725952. Available memory: 259686128 bytes.
m
Max memory: 1897725952. Available memory: 189293488 bytes.
m
Max memory: 1897725952. Available memory: 387686544 bytes.

使用可能なメモリが変動します。これはどのように起こりますか?GCは他のものをクリーンアップしていますか(実際にクリーンアップするためにヒープ上に他にどのようなものがありますか?)、freeMemory()メソッドはかなり離れた近似を返しますか?私は何かが足りないのですか、それとも夢中ですか?

4

1 に答える 1

1

より多くのメモリを消費すると、ヒープが大きくなります。freeMemory()増加する可能性がある現在のヒープ サイズに関連する使用量を報告することに注意してください。totalMemory()の代わりにチェックしてくださいmaxMemory()。私がこれを正しく思い出せば。

それとも、ガベージ コレクションされる可能性のある割り当てられているものを尋ねていますか?

  • ループでRandom割り当てる
  • OS ストリームからの読み取り、文字への解析、および行への解析のプロセス中に割り当てられたオブジェクト
  • 空きメモリ自体をチェックするために呼び出し中に割り当てられた可能性があるもの
于 2012-12-12T23:09:05.473 に答える