3

我想做什么

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

至今

标志 -XX:+UseLargePages 在使用堆缓冲区(非直接 ByteBuffers)时工作正常,但在使用 DirectByteBuffers 时不再工作。我也尝试过使用 MappedByteBuffers 和一个hugetlbfs 文件系统。这可行,但会引发许多问题,因此我正在寻找不同的解决方案。

配置 CentOS release 6.3、hotspot、jdk1.7

[编辑]

查看热点源代码,他们使用 malloc 来分配具有 Unsafe 的内存,是否需要 shmat/shmget 或 mmap 才能使用大页面。

[编辑] 为什么非堆内存

我们在一个 NUMA 上下文中,对于一个内存数据库,有很多长寿命的对象。当 UseNUMA 标志打​​开时,JVM 不会对旧代进行分区。使用直接内存允许我们让内存靠近需要它的线程。

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

4

3 回答 3

0

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

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

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

众所周知,这类低级效果很难隔离为性能问题的原因,而且很可能会浪费大量时间来追逐幻影效果并产生试图绕过 JVM 的解决方案,只会导致性能更差如果你坚持了那条人迹罕至的道路,那将是无法获得的。

于 2013-05-06T11:21:21.567 回答
0

对于那些感兴趣的人,链接到oracle 错误报告

对应的openJDK 票的链接。已关闭,目前无法修复。在 Linux 上,THP 功能可能会有所帮助,尽管它有自己的一堆问题。

于 2014-03-28T09:32:24.497 回答
0

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

于 2017-05-22T10:31:28.070 回答