問題タブ [mappedbytebuffer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java-mappedbytebuffer は直接メモリを占有しますか?
マップされたバイトバッファがJavaで直接メモリを占有するかどうかに興味がありますか? ここで述べたように
ダイレクト バイト バッファは、ファイルの領域をメモリに直接マッピングすることによって作成することもできます。
ファイルをメモリにマップするときは、ダイレクト メモリを使用する必要があります。しかし、JVM パラメータ "-XX:MaxDirectMemorySize=200MB" でプログラムを開始し、1GB のファイルをメモリにマップしようとしましたが、うまくいきました。さらに、最初に 200MB の directByteBuffer を割り当ててから、1GB のファイルをメモリにマップしようとしましたが、それでも機能しました! では、mappedbytebuffer はメモリのどの部分を占めるのでしょうか?
java - MappedByteBuffer 使用時の IndexOutOfBoundsException
MappedByteBuffer を使用して、データをファイルに保存/ロードすることを考えています。long 型のフィールド A があり、シリアル化すると文字列のフィールド B が次のようになるとします。B(文字列)
今、私はそれに書いて読みたいと思っています。サンプルコードの一部を次に示します。
mbb.getLong(0)
そのため、後で呼び出してlong を取得できますmbb.get(outputArray,8,outputArray.length)
しかし今、私は場所(2)で失敗しています。助言がありますか?
java - JavaでInteger.MAX_VALUEより大きいファイルをメモリマップする方法はありますか?
FileChannel#map
ファイルをマップする (つまり、メモリ マップを開始する) ために使用される は、long
長さパラメーターとして受け取ります。
それでも、ドキュメントにFileChannel#map
は次のよう に書かれています。
size - マップされる領域のサイズ。負ではなく、Integer.MAX_VALUE 以下でなければなりません
まず第一に、最大値しか許可しないのに、そもそも long を使用するのはなぜInteger.MAX_VALUE
ですか? それよりも大きなファイルを一度にマップすることは何とか可能ですか?
たとえば、10GB のファイルをマップしたい場合、次のように書きたいと思います (InvalidArgumentException
長すぎるために最終的には になります)。
そのために連続したメモリ マップを作成する必要がありますか。
java - メモリ マップト ファイルはマルチプロセス シナリオでどのように機能しますか?
この質問は何日も私を混乱させてきました:
同じマシンで実行される 2 つのプロセス (p_write
と) があるとします。p_read
プロセス
p_write
は、mmap ファイルを書き込み/更新するためのものです。プロセス
p_read
は、mmap ファイルを消費する、つまり、mmap ファイルから読み取るためのものです。
ここでの私の仮定は、p_write
最初に mmap ファイルにメモリ領域 (オフヒープ) を割り当てる必要があるということです (領域は、Java MappedByteBuffer
API を使用して自動的にファイルにマップされます)。
ここでの私の質問は、p_read が mmap ファイルからどのように読み取るかです。私の仮定では、p_read
マップ先の mmap ファイルに別の同じサイズのオフヒープ領域を割り当てる必要もありますが、このシナリオではメモリ量を 2 倍にする必要があるため、これは正しくないようです。
p_read
マップ先の mmap ファイルに別のメモリ空間を割り当てる必要がない場合p_read
、 によってファイルがマップされた正しいメモリ アドレスをどのように知ることができますp_write
か?
更新 1
または、これをフォローアップの質問と見なすことができます:FileChannel.map()
が 2 回呼び出された場合、同じファイルが 2 つの異なるメモリ空間に 2 回マップされますか?
と
2 つのシナリオがすべて 1 つの同じメモリ空間にマップされている場合は、実際には問題にならないのではないでしょうか?