我是靠谱客的博主 有魅力夏天,最近开发中收集的这篇文章主要介绍Direct buffer OutOfMemoryError,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

既然Direct memory是物理内存,那么是不是不受限制呢,这个肯定不是的。
我们来一段程序:

public class Jvm1_10 {
static int _10M=1024*1024*10;
public static void main(String[] args) {
List<Buffer>
list=new ArrayList<>();
int i=0;
try{
while (true){
ByteBuffer byteBuffer=ByteBuffer.allocateDirect(_10M);
list.add(byteBuffer);
i++;
}
}finally {
System.out.println(i);
}
}
}

执行结果:

364
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:694)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at Jvm1_10.main(Jvm1_10.java:19)

这个结果表明程序分配了364次,就内存溢出了,这说明我们程序是有控制的。我们加入代码:


System.out.println("maxDirectMemorym默认大小"+ VM.maxDirectMemory()/1024/1024+"MB");

输出:maxDirectMemorym默认大小3641MB
这个便是我们的默认配置,我们可以通过jvm参数控制这个默认值
-XX:MaxDirectMemorySize=20m

maxDirectMemorym默认大小20MB
2
Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory
at java.nio.Bits.reserveMemory(Bits.java:694)
at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)
at Jvm1_10.main(Jvm1_10.java:20)

最后

以上就是有魅力夏天为你收集整理的Direct buffer OutOfMemoryError的全部内容,希望文章能够帮你解决Direct buffer OutOfMemoryError所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部