我正在从堆外调用函数“unsafe.allocateMemory”来获取大量内存。但返回的值是奇数。
运行时环境显示如下:
这是我的代码:
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)大得多。我想知道该值是否是内存地址?如果是的话,实际上没有那么多内存,如何分配呢?如果不是,操作系统中内存/堆的基地址是多少。
最佳答案
Unsafe#allocateMemory
返回一个名为 "native pointer" 的东西。它本质上是与 JVM 进程关联的虚拟内存空间中的地址。操作系统和Memory Management Unit CPU内置的功能将负责将虚拟空间中的地址映射到真实物理内存中的地址。
由于地址空间是虚拟的,其中的数值与系统可用的物理内存量无关:虚拟机布局和从内存分配函数返回的地址由操作系统及其核心决定Java 所依赖的库。操作系统还必须考虑hardware limitations强加于虚拟地址空间。
另请参阅:
鸣谢:@sotirios-delimanolis 和 @klitos-kyriacou 留下的评论
关于java - Java 中 unsafe.allocateMemory 返回什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40892376/