私は、オフヒープから大量のメモリに対して関数unsafe.allocateMemoryを呼び出していました。しかし、返される値は奇数です。unsafe.allocateMemoryがJavaで返すもの
ランタイム環境は、ここで示しています ここ
が私のコードです:
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class UnsafeTest{
public static void main(String[] args){
try{
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
long addr = unsafe.allocateMemory(16);
System.out.println("the address is :"+addr);
unsafe.freeMemory(addr);
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}
結果:結果値はそんなにあるので
私は、何かが間違っていると思いました総メモリサイズ(約6G)よりも大きい。値がメモリアドレスだったのだろうか?もしそうなら、どのように実際にあまりメモリがないので、それを割り振ることができますか?そうでない場合は、OSのメモリ/ヒープのベースアドレスを指定します。
http://hg.openjdk.java @ .net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/misc/Unsafe.java#l466 –
Unsafeの使用は高度な低レベルプログラミングのためのものです。私はあなたがその資格を持たないことをお勧めします。 – DwB
https://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details –