我正在尝试使 HTTP 传输编码块与 Netty 4.0 一起工作。
到目前为止,我取得了成功。它适用于小型有效载荷。
然后我尝试使用大数据,它开始挂起。
我怀疑我的代码可能有问题,或者可能是 ByteBuf.copy() 泄漏。
我将我的代码精简到最低限度,以确保我没有其他泄漏源或副作用,并且我已经结束编写这个测试。完整的代码在这里。
基本上,当您使用 wget 连接到端口 8888 时,它会发送 1GB 的 0x0。我在连接时重现了该问题
wget http://127.0.0.1:8888 -O /dev/null
这是处理程序:
protected void channelRead0(ChannelHandlerContext ctx, FullHttpMessage msg) throws Exception {
DefaultHttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
HttpHeaders.setTransferEncodingChunked(response);
response.headers().set(CONTENT_TYPE, "application/octet-stream");
ctx.write(response);
ByteBuf buf = Unpooled.buffer();
int GIGABYTE = (4 * 1024 * 1024); // multiply 256B = 1GB
for (int i = 0; i < GIGABYTE; i++) {
buf.writeBytes(CONTENT_256BYTES_ZEROED);
ctx.writeAndFlush(new DefaultHttpContent(buf.copy()));
buf.clear();
}
ctx.writeAndFlush(LastHttpContent.EMPTY_LAST_CONTENT).addListener(ChannelFutureListener.CLOSE);
}
我的方法有什么问题吗?
编辑 :
使用 VisualVM,我发现ChannelOutboundBuffer
.
Entry[] buffer
不断增长,被 addCapacity()
多次调用。该Entry
数组似乎包含已(或应该)写入线路的缓冲区的副本。
我看到有wireshark数据进来......
这是堆转储的 Dropbox 链接