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

时间:2013-04-30 13:17:09

标签: java jvm-hotspot huge-pages directmemory

我想做什么

我需要使用直接内存来避免GC移动。我想为那些人启用大页面。

到目前为止

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

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

[编辑]

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

[编辑]为什么非堆内存

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

基准测试在决定使用DirectByteBuffers方面显然发挥了重要作用。我询问我是否应该使用DirectByteBuffer,我正在寻找我的问题的答案。

3 个答案:

答案 0 :(得分:0)

您是否有一个基准测试,明确表明GC重定位是您应用程序的瓶颈?

如果没有,请不要这样做。

如果是这样,请添加一个链接,以便进行同行评审。

众所周知,这些低级效应难以作为性能问题的原因而被隔离,并且很有可能浪费大量时间追逐幻象效应。产生一种试图绕过JVM&只会导致性能远远低于你坚持走好路径所能获得的性能。

答案 1 :(得分:0)

对于有兴趣的人,请指向oracle bug report

的链接

指向相应openJDK ticket的链接。关闭,因为到目前为止无法解决。 在Linux上,THP功能可能会有所帮助,即使它有自己的一堆问题。

答案 2 :(得分:0)

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