I can see this creating a lot of garbage for lines that come in parts as you will read the data in memory & then throw it away to read again. A better way could possibly be to search for EOL, slice the buffer & then convert to string. 
You can search using a ByteBufProcessor with ByteBuf.forEachByte().
This will not create intermediate garbage and you will get a single ByteBuf for the entire line.

You can either have another handler which is a ByteToMessageDecoder that converts ByteBuf generated by this decoder to string OR manage state in this decoder & add to the out list when the line is ready.