我在Torquebox上运行了各种Rails应用程序。偶尔,Torquebox会在短时间内(可能是2-5分钟)停止响应请求,并且日志将填满以下错误消息:
java.lang.OutOfMemoryError: Direct buffer memory
错误发生在不可预测的时间(通常是几天之间)。负载测试不能重现问题,并且无论如何在高峰负载期间都不会发生问题。而且,与我过去看到的许多其他类型的内存错误不同,服务器实际上会恢复并开始正常响应而无需任何重启或干预。
是否存在常见的编码错误,错误配置或其他可能导致此错误的潜在问题?谷歌揭示了各种库(例如Netty)的低级Java /垃圾收集类型问题,但我很想知道是否还有其他常见的地方可供查看。
答案 0 :(得分:2)
JNA/ByteBuffer not getting freed and causing C heap to run out of memory表示如果Java堆不经常需要垃圾收集(可能在非高峰时间),则可能无法清除直接内存。
如果使用直接内存有一个常量函数,无论负载如何,那么应用程序可能在较轻的加载时间内没有足够多地调用垃圾回收。使用GC模块可能会有所帮助(http://ruby-doc.org/core-2.0/GC.html)。
答案 1 :(得分:1)
在这种情况下的问题最终导致缺乏足够的总可用内存。 Java的内存占用量最终可能远远大于堆分配。直接缓冲区内存只是堆在堆外的内存类型之一。
我仍然不清楚为什么波动会在不可预测的时间发生,但确保系统有足够的过剩记忆来处理一些波动对稳定性至关重要。