Java Direct 缓冲区内存错误的常见原因有哪些



我在Torquebox上运行了各种Rails应用程序。有时,Torquebox 会在短时间内(可能是 2-5 分钟)停止响应请求,日志将填满以下错误消息:

java.lang.OutOfMemoryError: Direct buffer memory

错误发生在不可预测的时间(通常间隔几天)。负载测试不会重现该问题,并且该问题无论如何都不会在峰值负载期间发生。而且,与我过去看到的许多其他类型的内存错误不同,服务器实际上可以恢复并再次开始正常响应,而无需任何形式的重新启动或干预。

是否有任何常见的编码错误、配置错误或其他经常导致此错误的潜在问题?谷歌揭示了各种库(例如Netty)的许多较低级别的Java/垃圾收集类型问题,但我有兴趣看看是否还有其他常见的地方可以查看。

JNA/ByteBuffer 未释放并导致 C 堆内存不足表明,如果 Java 堆不经常需要垃圾回收(也许,在您的情况下,在非高峰时间),则可能不会清除直接内存。

如果有一个使用直接内存的常量函数,则无论负载如何,则应用程序在较轻的加载时间内可能没有充分调用垃圾回收。使用 GC 模块可能会有所帮助 (http://ruby-doc.org/core-2.0/GC.html)。

在这种情况下,问题最终是缺少足够的总可用内存。Java 的内存占用量最终可能比堆分配大得多。直接缓冲区内存只是堆外的内存使用类型之一。

我仍然不清楚为什么波动发生在不可预测的时间,但确保系统上有足够的多余内存来处理一些波动对于稳定性至关重要。

相关内容

最新更新