在Linux上的java热点jvm中使用大型页面和DirectByteBuffer

在Linux上的java热点jvm中使用大型页面和DirectByteBuffer,java,jvm-hotspot,huge-pages,directmemory,Java,Jvm Hotspot,Huge Pages,Directmemory,我想做什么 我需要使用直接内存来避免GC移动东西。我想启用这些巨大的页面 到目前为止 标志-XX:+UseLargePages在使用堆缓冲区(非直接ByteBuffers)时工作正常,但在使用DirectByteBuffers时不再工作。 我还尝试使用MappedBytebuffer和hugetlbfs文件系统。这是可行的,但会引起一些问题,所以我正在寻找一个不同的解决方案 配置 CentOS 6.3版,热点,jdk1.7 [编辑] 查看热点源代码,他们正在使用malloc来分配不安全的内存,如

我想做什么

我需要使用直接内存来避免GC移动东西。我想启用这些巨大的页面

到目前为止

标志-XX:+UseLargePages在使用堆缓冲区(非直接ByteBuffers)时工作正常,但在使用DirectByteBuffers时不再工作。 我还尝试使用MappedBytebuffer和hugetlbfs文件系统。这是可行的,但会引起一些问题,所以我正在寻找一个不同的解决方案

配置 CentOS 6.3版,热点,jdk1.7

[编辑]

查看热点源代码,他们正在使用malloc来分配不安全的内存,如果使用大型页面需要shmat/shmget或mmap

[编辑]为什么使用非堆内存

对于内存中的数据库,我们处于NUMA上下文中,有许多长寿命对象。当UseNUMA标志打开时,JVM不会对旧的gen进行分区。使用直接内存可以让内存保持在需要它的线程附近


显然,基准测试在使用DirectByteBuffers的决策中发挥了巨大作用。我不是在问我是否应该使用DirectByteBuffer,而是在寻找我的问题的答案。

您是否有一个基准测试可以不可撤销地表明GC重新定位是应用程序的瓶颈

如果没有,请不要这样做

如果是,请添加链接,以便同行评审


众所周知,作为性能问题的原因,这些低水平的影响很难分离出来,而且,很可能会浪费大量时间去追逐幻影效果&生成一个试图绕过JVM的解决方案&只会导致比坚持走老路要糟糕得多的性能。

对于那些感兴趣的人来说,链接到

链接到相应的。已关闭,因为到目前为止无法修复。
在Linux上,THP功能可能会有所帮助,尽管它本身也有一系列问题。

解决方法是使用JNI,使用您喜欢的任何方法在C中分配内存,并返回ByteBuffer。看见这种方法还有一个额外的好处,即您也可以确定地释放内存