首页 > 解决方案 > 压缩导致 OutOfMemoryError

问题描述

在生产中的一些大型 sstable 上运行压缩时出现 OutOfMemoryError,表大小约为 800 GB,但小型 sstable 上的压缩工作正常。

$ noodtool compact keyspace1 users
error: Direct buffer memory
-- StackTrace --
java.lang.OutOfMemoryError: Direct buffer memory
        at java.nio.Bits.reserveMemory(Bits.java:693)
        at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
        at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
        at org.apache.cassandra.io.compress.BufferType$2.allocate(BufferType.java:35)

Java 堆内存(Xms 和 Xmx)已设置为 8 GB,想知道我是否应该将 Java 堆内存增加到 12 或 16 GB?

标签: cassandracassandra-3.0

解决方案


这不是堆大小,而是所谓的“直接内存” - 您需要检查您拥有的数量(可以通过类似这样的东西指定-XX:MaxDirectMemorySize=512m,或者它将采用与堆相同的最大大小)。您可以通过增加堆大小来间接增加它,也可以通过-XX标志显式控制它。这是一篇关于 Java 中非堆内存的好文章。


推荐阅读