压缩导致 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.
中的非堆内存
当运行在生产中对一些大 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.