5

FileChannel#map結果に必要なすべてのメモリをすぐに割り当てますかByteBuffer、それともバッファからの読み取り中にオンデマンドでのみ割り当てられますか?

簡単なテスト プログラムで 500 MB 以上のファイルをすべてマッピングして、プロセスのメモリ使用量を調べました。(両方Runtime#totalMemoryを使用し、groovysh プロセスの OS X アクティビティ モニターでそれを観察します。) メモリ使用量が 30 MB を超えることはありませんでした。

では、Java 実装は、ネイティブ呼び出しでのメモリ使用量の一部を「隠す」ことができますか? もしそうなら、それが OS X でどれくらいあるかを調べる方法はありますか?

4

3 に答える 3

5

メモリ使用量は単純ではありません。によって使用される実際のバッファーFileChannel.mapは、Java ヒープの一部ではありません。実際、メモリは他のプロセスと共有される場合があります。ページがタッチされるまで、ファイルはディスクから読み取られない場合もあります。

于 2009-05-08T10:51:22.453 に答える
1

はい。ヒープの一部ではありません。それでも、OS によってはメモリが予約されます。OS X では、UNIX に似ているため、必要なメモリ量を確認するために top または ps を使用できるはずです。

于 2009-05-08T14:37:41.823 に答える
1

java.nio.MappedByteBuffer#load は、すべてのファイル コンテンツのメモリへのロードをトリガーします (それ以外の場合はオンデマンドです)。

このメソッドは、返されたときに * このバッファの内容が物理メモリに常駐するように最善を尽くします。* このメソッドを呼び出すと、いくつかのページ フォールトと I/O 操作が * 発生する可能性があります。

于 2012-03-18T16:08:31.940 に答える