Direct buffer OutOfMemoryError

简介: 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)


目录
相关文章
解决报错:AddressSanitizer: heap-buffer-overflow
leetcode使用AddressSanitizer检查内存是否存在非法访问。报此错,主要是访问了非法内容。 解决方法:数组访问越界,导致此错,后来发现是在访问二维数组的边界row和col弄反了。。
2677 0
|
12月前
|
Docker 容器
解决Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
解决Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory.
872 0
|
Java Maven Windows
maven内存不足:Unexpected error occurred: Not enough memory to allocate buffers for rehashing Java heap
maven内存不足:Unexpected error occurred: Not enough memory to allocate buffers for rehashing Java heap
130 0
|
存储 缓存 算法
Buffer
Buffer
197 0
Buffer
|
存储 SQL 缓存
写缓冲(change buffer),这次彻底懂了!!!
一次了解缓冲池(buffer pool)。
518 0
写缓冲(change buffer),这次彻底懂了!!!