cassandra - 压缩导致 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?
解决方案
这不是堆大小,而是所谓的“直接内存” - 您需要检查您拥有的数量(可以通过类似这样的东西指定-XX:MaxDirectMemorySize=512m
,或者它将采用与堆相同的最大大小)。您可以通过增加堆大小来间接增加它,也可以通过-XX
标志显式控制它。这是一篇关于 Java 中非堆内存的好文章。
推荐阅读
- ios - 自定义 UITableViewCell 中的操作按钮调用的 UITableView reloadRows() 总是落后一步
- spring - Kafka 消费者在使用主题模式和大消息时不会获取新记录
- python - 如何解决 Pycharm 错误:- 未解决的参考:SQLAlchemy
- swift - 使初始化程序通用,没有函数签名中的类型
- python - mysqld.exe 高磁盘读取
- .htaccess - 为什么我的 Htaccess 重定向不起作用?
- c# - Cookies 在 Firefox 和 Opera 中不起作用 - 但在 Chrome 和 Edge 中可以正常工作
- java - 如何为不同的 Apache Camel 路由设置几个不同的 WebFlux 客户端属性?
- rubygems - sqlite3 1.4.2 无法安装
- python-3.x - Pytorch - 在 GPU 上训练时在设备 1 上的副本 1 中捕获 StopIteration 错误