我想做什么
我需要使用直接内存来避免GC移动。我想为那些人启用大页面。
到目前为止
标志-XX:+ UseLargePages在使用堆缓冲区(非直接ByteBuffers)时工作正常,但在使用DirectByteBuffers时不再起作用。 我也尝试过使用MappedByteBuffers和一个hugetlbfs文件系统。这有效但引发了一些问题,所以我正在寻找一种不同的解决方案。
配置 CentOS版本6.3,热点,jdk1.7
[编辑]
查看热点源代码,他们使用malloc来分配不安全的内存,使用大页面需要shmat / shmget或mmap。
[编辑]为什么非堆内存
对于内存数据库,我们处于NUMA上下文中,包含许多长期存在的对象。当UseNUMA标志打开时,JVM不对旧的gen进行分区。使用直接内存允许我们让内存保持接近需要它的线程。
基准测试在决定使用DirectByteBuffers方面显然发挥了重要作用。我不询问我是否应该使用DirectByteBuffer,我正在寻找我的问题的答案。
答案 0 :(得分:0)
您是否有一个基准测试,明确表明GC重定位是您应用程序的瓶颈?
如果没有,请不要这样做。
如果是这样,请添加一个链接,以便进行同行评审。
众所周知,这些低级效应难以作为性能问题的原因而被隔离,并且很有可能浪费大量时间追逐幻象效应。产生一种试图绕过JVM&只会导致性能远远低于你坚持走好路径所能获得的性能。
答案 1 :(得分:0)
对于有兴趣的人,请指向oracle bug report
的链接指向相应openJDK ticket的链接。关闭,因为到目前为止无法解决。 在Linux上,THP功能可能会有所帮助,即使它有自己的一堆问题。
答案 2 :(得分:0)
解决方法是使用JNI使用您喜欢的任何方法在C中分配内存并返回ByteBuffer。见NewDirectByteBuffer。这种方法还有一个额外的好处,即您可以确定地释放内存。