压缩导致 OutOfMemoryError

Compaction cause OutOfMemoryError

当运行在生产中对一些大 sstables 进行压缩时,我得到 OutOfMemoryError,table 大小约为 800 GB,在小 sstable 上进行压缩不过 s 工作正常。

$ 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.allocate(BufferType.java:35)

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

它不是堆大小,而是所谓的“直接内存”——你需要检查你有多少(它可以用这样的东西指定 -XX:MaxDirectMemorySize=512m,否则它会占用与堆相同的最大大小)。您可以通过增加堆大小来间接增加它,或者您可以通过 -XX 标志显式控制它。这是 good article 关于 Java.

中的非堆内存