java NIO 报OutOfMemory:Direct buffer memory

1.NIO底层使用了ByteBuffer.allocteDirect(capability)来分配缓存,这种方式是分配OS本地内存,不属于GC管辖范围。

2.本地内存在JAVA中有一个对应的包装类DirectByteBuffer,该类属于Java类,适当的时候会被GC回收,当它被回收前会调用本地方法把直接内存给释放了,所以本地内存可以随DirectByteBuffer对象被回收而自动回收,貌似没有问题;但如果不断分配本地内存,堆内存很少使用,那么JVM就不需要执行GC,DirectByteBuffer对象们就不会被回收,这时候堆内存充足,但本地内存可能已经使用光了,再次尝试分配本地内存就会出现OutOfMemoryError,那程序就直接崩溃了。

3.以上是NIO底层产生这个问题的原因分析,默认能使用的本地内存大小与-Xmx一致(前提是宿主机有足够的剩余内存),否则能分配到的本地内存大小=宿主机内存-已使用内存。比如只有jvm的环境,宿主机内存2g,-Xmx1.6g,则能使用的本地内存大小为0.4g。

另外注意jvm不要加上DisableExplicitGC参数。

 

 

Openj9默认-XX:MaxDirectMemorySize=64M,当出现Direct buffer memory,应用可根据自身情况调大-XX:MaxDirectMemorySize=1G

你可能感兴趣的:(java)