0

私はJavaで大きなハッシュテーブルを利用しなければならないプログラムを書いています.ハッシュテーブルが大きければ大きいほど良いです(それはチェスプログラムです:P). 基本的に、ハッシュ テーブルの一部として、"long[]" の配列、"short[]" の配列、および "byte[]" の 2 つの配列があります。それらはすべて同じサイズでなければなりません。ただし、テーブル サイズを 1000 万に設定すると、クラッシュし、「Java ヒープがメモリ不足です」と表示されます。これは私には意味がありません。これが私がそれを見る方法です:

1 Long + 1 Short + 2 Bytes = 12 bytes
x 10,000,000 = 120,000,000 bytes
/ 1024 = 117187.5 kB
/ 1024 = 114.4 Mb

現在、114 Mb の RAM は私には多すぎるとは思えません。合計で、私の CPU には 4Gb の RAM が Mac に搭載されています。FreeMemory というアプリを使用すると、空き RAM の量が表示されます。このプログラムの実行中は約 2Gb です。また、Java プリファレンスを -Xmx1024m のように設定したので、Java は最大 1 ギガのメモリを使用できるはずです。では、なぜ 114Mb しか割り当てられないのでしょうか?

4

4 に答える 4

1

114 MBを使用する必要があると予測しましたが、これを実行すると(4 GBのWindowsボックスで)

public static void main(String... args) {
    long used1 = memoryUsed();
    int Hash_TABLE_SIZE = 10000000;
    long[] pos = new long[Hash_TABLE_SIZE];
    short[] vals = new short[Hash_TABLE_SIZE];
    byte[] depths = new byte[Hash_TABLE_SIZE];
    byte[] flags = new byte[Hash_TABLE_SIZE];
    long used2 = memoryUsed() - used1;
    System.out.printf("%,d MB used%n", used2 / 1024 / 1024);
}

private static long memoryUsed() {
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}

プリント

114 MB used

私はあなたがあなたの問題の原因である何か他のことをしているのではないかと思います。

Oracle HotSpot Java 7update10を使用しています

于 2013-01-20T21:19:41.923 に答える
0

各オブジェクトが参照であり、メモリも使用することを考慮していません。さらに「隠されたもの」...アライメントも考慮する必要があります...バイトは必ずしもバイトではありません;-)

実際に使用されているメモリの量を確認するには、プロファイラーを使用できます。

標準のHashMap(またはJDKの同様のもの)を使用している場合、各「長い」(ボクシング/アンボクシング)は実際には8バイトを超えます)、これをベースとして使用できます...(使用するメモリが少なくなります)

于 2013-01-20T20:54:38.647 に答える
0

私が BlueJ について読んだことと、深刻な技術情報を見つけるのはほとんど不可能であることから、BlueJ VM はプリミティブ型をまったくサポートしない可能性が非常に高いです。あなたの配列は実際にはボックス化されたプリミティブです。BlueJ は、オブジェクト指向に重点を置いて、すべての Java 機能のサブセットを使用します。

その場合、さらに BlueJ VM の優先順位リストでパフォーマンスと効率が非常に低いことを考慮すると、実際には思ったよりかなり多くのメモリを使用している可能性があります。

于 2013-01-20T21:06:05.267 に答える
-2

実行のたびにヒープメモリをクリーンアップする方法の1つは、次の1つのリンクにあると思います。

Javaヒープスペースのメモリ不足

于 2013-01-20T20:15:09.040 に答える