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

来源:互联网 发布:Linux安装sip 编辑:程序博客网 时间:2024/04/29 14:41

前两天测试问了个问题,就是内存爆掉,排查原因是因为缓存东西太多,而他把缓存的东西读取到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申请内存的方法