Java 我们是否需要显式释放使用netty传输的对象的内存?

Java 我们是否需要显式释放使用netty传输的对象的内存?,java,netty,Java,Netty,我正在使用netty进行项目的数据传输。项目的这一部分基本上是发送和接收数据包。每个数据包基本上都是一个对象,封装了一些元数据和实际的文件块。当我尝试传输大文件(比如5GB)时,不知何故,内存使用率会上升,并且在传输文件后无法释放内存。对于5gb文件,内存使用从~1gb开始,一直增加到15GB,直到我退出程序为止 这是我的数据包对象: public class BlockPacket { private String requestId; private String b

我正在使用netty进行项目的数据传输。项目的这一部分基本上是发送和接收数据包。每个数据包基本上都是一个对象,封装了一些元数据和实际的文件块。当我尝试传输大文件(比如5GB)时,不知何故,内存使用率会上升,并且在传输文件后无法释放内存。对于5gb文件,内存使用从~1gb开始,一直增加到15GB,直到我退出程序为止

这是我的数据包对象:

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对象。感谢您的帮助