0

Windows 7 64ビットで1.6.0_25 64ビットを実行しています。

私のアプリケーションは非常にメモリを集中的に使用するため、JVM を最大メモリで実行しようとしています...しかし悲しいことに...メモリ割り当てが構築されず、Windows から多くのページ フォールトが発生して、次のセットを保持し続けます。仮想メモリ内。

Java -Xms2G -Xmx3G Test を実行しています

次のコードは、ファイル全体を読み込もうとする試みです...読み込み中にページフォールトが発生しないようにします。

File f = new File("veryLARGEfile.txt");
FileInputStream in = new FileInputStream(f);
int i = (int) f.length();
System.out.println("Bytes in file: " + i);

byte[] file = new byte[i];
i = in.read(file);
System.out.println("Bytes read: " + i);

この方法を実行すると、Windowsタスクマネージャーで、ファイルの読み取り中にシステムが2G相当のメモリに達することがわかります...しかし、読み取りが完了すると...メモリは再び低下します!!!!

これは大きな問題です...アクティブなメモリにとどまるには、バイト配列全体が必要です。

ありがとう、エイ


int と float を含むオブジェクトの ArrayList を保持する代わりに、基本的な配列型 int[][] と float[][] を使用してデータを保持するようにコードを変更しました。

これを行うと、Javaメモリがスワップされないことがわかりました(したがって、ヒープメモリはここのスタックとは少し異なる方法で扱われると思います)[ああ、すべてのコードを静的型付けに変更しました-知っています、非常に悪いですプログラミングスタイル】

私が今直面している問題は、HashMap を処理する方法です...ルックアップ テーブルを構築しようとするすべての試みは、O(n^2) 実行時間で構築に失敗しています!!!

4

2 に答える 2

1

プロセスのメモリのどの部分を RAM に保持し、どの部分をスワップアウトするかは、JVM ではなく OS によって決定されます。一般に、OS は頻繁にアクセスされるメモリを RAM に保持します。

特定のメモリを RAM に「固定」できる OS API があるかもしれませんが、この機能は Java によって公開されていません。

ただし、必要に応じて、ファイルを明示的に読み取るのではなく、ファイルをメモリ マップすることを検討する必要があります。はるかに高速になる可能性があります。

于 2011-04-25T10:41:40.690 に答える
0

Java は、すべてのアプリケーションをメモリ内に保持しようとかなり懸命に努力します。別の言い方をすれば、メモリのいずれかがディスクにスワップされるとパフォーマンスが非常に低下するため、最後の手段としてスワップ アウトします。

Java アプリケーションがディスクにスワップしている場合、それはアプリケーションがシステムに対して大量のメモリを使用していることが原因です。アプリケーションがメモリ集約的で、これだけのメモリを使用する必要がある場合は、システムに十分なメモリがあることを確認することをお勧めします。ところで。8 GB のサーバーを $500 で購入でき、新しい 16 GB ワークステーションを $1000 で購入できます。;)

于 2011-04-25T14:41:09.980 に答える