異常`OutOfMemoryError: Direct buffer memory`出現在Tomcat使用APR/native庫時,表明堆外內存(Direct Memory)耗盡,而非堆內存。本文深度解析原因與解決方案。
java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory
at java.nio.DirectByteBuffer.
at org.apache.coyote.http11.InternalAprInputBuffer.
at org.apache.coyote.http11.Http11AprProcessor.
在Tomcat啟動腳本(`catalina.sh`/`setenv.sh`)中添加:
CATALINA_OPTS="-XX:MaxDirectMemorySize=512m" # 根據機器內存調整,建議≥1GB
或JVM參數:`-XX:MaxDirectMemorySize=1g`
...
/>
若不依賴APR的高性能優勢(如OpenSSL硬件加速),改用`Http11Nio2Protocol`:
NIO2使用堆內ByteBuffer(受`-Xmx`控制),避開Direct Memory限制,現代JDK性能已接近APR。
關鍵認知:Direct Memory不受-Xmx控制,必須顯式設置-XX:MaxDirectMemorySize,APR模式下更是剛需。