を使用して特定のファイルをメモリマッピングすることにより、2 つ以上の JVM 間で一種の共有キャッシュを実装しようとしていましたMappedByteBuffer
。MappedByteBuffer.load()
仕様から、使用時にデータを直接バッファにロードする必要があることがわかります。これについていくつか質問があります。
私のコードスニペット::
RandomAccessFile file = new RandomAccessFile("file.txt","rw");
FileChannel fc = file.getChannel();
MappedByteBuffer buf5 = fc.map(MapMode.READ_WRITE, 0, fc.size());
//ByteBuffer buf6 = ByteBuffer.allocateDirect(100000000);
buf5.load();
try
{
Class c = Class.forName("java.nio.Bits");
Field f = c.getDeclaredField("reservedMemory");
f.setAccessible(true);
long reservedMemory = f.getLong(null);
f = c.getDeclaredField("maxMemory");
f.setAccessible(true);
System.out.println(
"Direct Memory Usage: "+ reservedMemory +"/"+ f.getLong(null)+"\n");
}
catch (Throwable t)
{
}
上記のコードの出力は、直接メモリ使用量が 0 バイトです (File.txt は 1 GB)。しかし、行のコメントを外すと..
ByteBuffer buf6 = ByteBuffer.allocateDirect(100000000);
Direct Memory Usage は 100MB です。そもそもなぜ直接メモリを使用していないのか(つまり、行がコメントアウトされているとき)、なぜそうなのか理解できません
上記のコードの直接メモリ使用量は 0 B ですが、プロセスの常駐メモリ ( unix top を使用) が 1 GB 増加していることがわかります。しかし、ボックスで「free -m」を実行しても、メモリ使用量の増加は見られません。
どちらの場合も、メモリがどこに行き着くのかについて少し混乱しています。
ありがとう!