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