java - Java 中 unsafe.allocateMemory 返回什么

标签 java unsafe

我正在从堆外调用函数“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/

相关文章:

java - 在 osgi maven 包中以编程方式更改 log4j 文件名不起作用

java - 我的脚本没有在最后一个填充行之后创建新行

java - 如何在 wildfly 10 中配置数据源?

java - 简单的对象和方法

c# - 为什么这个图像阈值在 windows 中有效,但在 mono/linux 中无效?

java - 将对象移出堆

pointers - 在 Rust 中有效地写入多个字节

java - DataStax Cassandra 找不到 Logback-Classic

rust - 摆弄生命周期 : sanity check on unsafe reinterpretation of lifetimes

c# - 宪兵不安全代码检测