我在 Torquebox 上运行着各种 Rails 应用程序。有时,Torquebox 会在短时间内(可能 2-5 分钟)停止响应请求,并且日志中会填满以下错误消息:
java.lang.OutOfMemoryError: Direct buffer memory
错误发生的时间是不可预测的(通常是几天之间)。负载测试不会重现该问题,而且该问题在峰值负载期间也不会发生。而且,与我过去见过的许多其他类型的内存错误不同,服务器实际上恢复并再次开始正常响应,而无需任何类型的重新启动或干预。
是否有任何常见的编码错误、错误配置或其他经常导致此错误的潜在问题? Google 揭示了各种库(例如 Netty)的许多较低级别的 Java/垃圾收集类型问题,但我有兴趣看看是否还有其他常见的地方可以查看。
最佳答案
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 )。
关于java - Java Direct 缓冲区内存错误的常见原因有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664177/