nio 使用的都是直接内存吗?

前两天测试问了个问题,就是内存爆掉,排查原因是因为缓存东西太多,而他把缓存的东西读取到list中,每请求一次读取一次,没有释放掉导致内存溢出,本来还以为是请求过多是nio的原因。

后来经过nio的socketChannel 和 ServerSocketChannel测试,
在配置jvm参数(-Xmx100M -Xms100M -Xmn30M)发现在客户端有5000不到的空连接的时候,会出现内存溢出,现在就不禁会疑惑了,不是nio使用的都是直接内存吗,经过今天对tomcat 8.5的测试,发现请求进来,内存分配都是在堆中,通过查看源码发现

在ByteBuffer 有两个子类比较重要HeapByteBuffer和DirectByteBuffer,字面意思上理解,第一个是堆中的,第二个是机器内存中的。

例如,在byteBuffer申请内存的时候有两个方法

申请堆内存

 public static ByteBuffer allocate(int capacity) {
        if (capacity < 0)
            throw new IllegalArgumentException();
        return new HeapByteBuffer(capacity, capacity);
    }

申请直接内存

public static ByteBuffer allocateDirect(int capacity) {
        return new DirectByteBuffer(capacity);
    }

所以nio中使用直接内存还是堆内存,取决于我们使用的是哪一个ByteBuffer申请内存的方法

你可能感兴趣的:(java)