3

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

java.lang.OutOfMemoryError: Direct buffer memory

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

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

4

2 回答 2

2

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

如果您有一个使用直接内存的常量函数,而不管负载如何,那么应用程序可能在较轻的负载时间内调用的垃圾收集不够。使用 GC 模块可能会有所帮助(http://ruby-doc.org/core-2.0/GC.html)。

于 2013-09-06T20:47:49.623 回答
1

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

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

于 2014-01-30T16:31:27.630 回答