Java 我们是否需要显式释放使用netty传输的对象的内存?
我正在使用netty进行项目的数据传输。项目的这一部分基本上是发送和接收数据包。每个数据包基本上都是一个对象,封装了一些元数据和实际的文件块。当我尝试传输大文件(比如5GB)时,不知何故,内存使用率会上升,并且在传输文件后无法释放内存。对于5gb文件,内存使用从~1gb开始,一直增加到15GB,直到我退出程序为止 这是我的数据包对象:Java 我们是否需要显式释放使用netty传输的对象的内存?,java,netty,Java,Netty,我正在使用netty进行项目的数据传输。项目的这一部分基本上是发送和接收数据包。每个数据包基本上都是一个对象,封装了一些元数据和实际的文件块。当我尝试传输大文件(比如5GB)时,不知何故,内存使用率会上升,并且在传输文件后无法释放内存。对于5gb文件,内存使用从~1gb开始,一直增加到15GB,直到我退出程序为止 这是我的数据包对象: public class BlockPacket { private String requestId; private String b
public class BlockPacket
{
private String requestId;
private String blockId;
private int packetSeqNo=0;
private byte[] data;
public BlockPacket(){
}
public String toString()
{
return "BlockPacket [requestId=" + requestId + ", blockId=" + blockId + ", packetSeqNo=" + packetSeqNo + "]";
}
public String getRequestId()
{
return requestId;
}
public void setRequestId(String requestId)
{
this.requestId = requestId;
}
public String getBlockId()
{
return blockId;
}
public void setBlockId(String blockId)
{
this.blockId = blockId;
}
public int getPacketSeqNo()
{
return packetSeqNo;
}
public void setPacketSeqNo(int no)
{
this.packetSeqNo = no;
}
public byte[] getData()
{
return data;
}
public void setData(byte[] data)
{
this.data = data;
}
}
下面是ServerHandler上的channelRead
@Override
public void channelRead(ChannelHandlerContext ctx, Object obj)
{
if (obj instanceof BlockPacket)
{
BlockPacket packet = (BlockPacket) obj;
//Do something with packet
}else if (obj instanceof Block){
Block block = (Block) obj;
//Do something with block
}else{
//Do something else
}
}
这是我的自定义编码和解码
@Override
protected void encode(ChannelHandlerContext ctx, Object in, ByteBuf out) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
Output output = new Output(outStream);
kryo.writeClassAndObject(output, in);
output.flush();
byte[] outArray = outStream.toByteArray();
out.writeInt(outArray.length);
out.writeBytes(outArray);
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
if (in.readableBytes() < 4)
return;
in.markReaderIndex();
boolean read = false;
if(len == 0){
read = true;
len = in.readInt();
}
if ((in.readableBytes() < len && read) || (in.readableBytes() < len+4 && !read)) {
in.resetReaderIndex();
read = false;
return;
}
if (!read)
in.readInt();
byte[] buf = new byte[len];
in.readBytes(buf);
Input input = new Input(buf);
Object object = kryo.readClassAndObject(input);
out.add(object);
}
@覆盖
受保护的void encode(ChannelHandlerContext ctx、对象输入、ByteBuf输出)引发异常{
ByteArrayOutputStream outStream=新建ByteArrayOutputStream();
输出=新输出(超出流);
writeClassAndObject(输出,单位为);
output.flush();
字节[]outArray=outStream.toByteArray();
out.writeInt(outArray.length);
out.writeBytes(outArray);
}
@凌驾
受保护的无效解码(ChannelHandlerContext ctx、ByteBuf输入、列表输出)引发异常{
if(in.readableBytes()<4)
返回;
in.markReaderIndex();
布尔读取=假;
如果(len==0){
读=真;
len=in.readInt();
}
if((in.readableBytes()
我成功了,但我无法解决我的问题。本教程中的示例通常针对ByteBuf,它具有release()方法。然而,我的包对象是一个简单的Java对象。感谢您的帮助