我想做什么
我需要使用直接内存来避免 GC 移动东西。我想为那些启用大页面。
至今
标志 -XX:+UseLargePages 在使用堆缓冲区(非直接 ByteBuffers)时工作正常,但在使用 DirectByteBuffers 时不再工作。我也尝试过使用 MappedByteBuffers 和一个hugetlbfs 文件系统。这可行,但会引发许多问题,因此我正在寻找不同的解决方案。
配置 CentOS release 6.3、hotspot、jdk1.7
[编辑]
查看热点源代码,他们使用 malloc 来分配具有 Unsafe 的内存,是否需要 shmat/shmget 或 mmap 才能使用大页面。
[编辑] 为什么非堆内存
我们在一个 NUMA 上下文中,对于一个内存数据库,有很多长寿命的对象。当 UseNUMA 标志打开时,JVM 不会对旧代进行分区。使用直接内存允许我们让内存靠近需要它的线程。
在决定使用 DirectByteBuffers 的过程中,基准测试显然发挥了重要作用。我不是在问我是否应该使用 DirectByteBuffer,而是在寻找我的问题的答案。