本文主要是介绍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 NIO 报OutOfMemory:Direct buffer memory的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!