nioは直接メモリを使用していますか?
1526 ワード
先日テストで質問がありましたが、メモリが爆発したのは、キャッシュされたものが多すぎるためです.彼はキャッシュされたものをリストに読み込み、リクエストごとに1回読み取り、解放されずにメモリがオーバーフローしたためです.リクエストが多すぎるのはnioのせいだと思っていました.
その後、nioのsocketChannelとServerSocketChannelのテストを経て、jvmパラメータ(-Xmx 100 M-Xms 100 M-Xmn 30 M)を構成すると、クライアントに5000未満の空き接続がある場合、メモリオーバーフローが発生することがわかり、nioが使用しているのは直接内蔵ではないかと疑問に思うようになりました.今日tomcat 8.5のテストを経て、リクエストが入ってきたことがわかりました.メモリ割り当てはすべてスタックにあり、ソースコードを表示することで発見されます.
ByteBufferには2つのサブクラスが重要ですHeapByteBufferとDirectByteBufferは、文字通り、1つ目はスタック内、2つ目はマシンメモリ内です.
たとえば、byteBufferでメモリを申請する場合は2つの方法があります.
申請スタックメモリ
ダイレクトメモリの申請
だからnioで直接メモリを使うかスタックメモリを使うかは、私たちがどのByteBufferを使ってメモリを申請するかによって決まります.
その後、nioのsocketChannelとServerSocketChannelのテストを経て、jvmパラメータ(-Xmx 100 M-Xms 100 M-Xmn 30 M)を構成すると、クライアントに5000未満の空き接続がある場合、メモリオーバーフローが発生することがわかり、nioが使用しているのは直接内蔵ではないかと疑問に思うようになりました.今日tomcat 8.5のテストを経て、リクエストが入ってきたことがわかりました.メモリ割り当てはすべてスタックにあり、ソースコードを表示することで発見されます.
ByteBufferには2つのサブクラスが重要ですHeapByteBufferとDirectByteBufferは、文字通り、1つ目はスタック内、2つ目はマシンメモリ内です.
たとえば、byteBufferでメモリを申請する場合は2つの方法があります.
申請スタックメモリ
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を使ってメモリを申請するかによって決まります.