I am using netty for data transfer for a project. This part of the project 
is basically sending and receiving data packets. Each packet is basically 
an object that encapsulates some metadata and actual file chunks. When I 
try to transfer large files, say 5GB, somehow memory usage going up and 
does not free after file has been transferred. For 5gb file, memory usage 
starts form ~1gb and goes up to 15GB, and stays there until I quit the 
program.

This is my packet object:


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;
    }}



Here is channelRead at ServerHandler:

@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 
           }
        }


Here is my custom custom encode and decode:

@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);
    }

I went through Reference counted object 
<http://netty.io/wiki/reference-counted-objects.html>,
 but I could not solve my problem. Examples in this tutorial are 
generally for ByteBuf, which has release() method. However, my Packet 
object is a simple Java object. Any help is appreciated.

-- 
You received this message because you are subscribed to the Google Groups 
"Netty discussions" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/netty/3fb5c8dd-2035-4a4d-bc83-f9db1a04486d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to