Memory leak in ZlibEncoder/Decoder?

Evil Ipos evil.ipos at gmail.com
Mon Oct 17 13:35:39 EDT 2011


I have simple server, that waits for TCP connections on specified port. Send
reply (around 500 bytes) and close connection. It is around 100 requests per
minute. When i added ZlibEncoder/Decoder to pipline i get sometimes OOM.
Without ZlibEncoder/Decoder all works ok. JVM has assigned 4GB of memory so
i think enough for 100 clients.

I used VisualVM to profile my application, and when looked at number of
class instances i see that classes from netty.util.internal.jzlib.* are
growing (when i perfrom GC nothing happen to them)

I'm doing something wrong or Zlib Encoder/Decoder has memory leak?

This is my PiplineFactory (MultiProtobufDecoder & MultiProtobufEncoder come
from Netty 4)

package update.listener;

import ipm.codec.protobuf.MultiProtobufDecoder;
import ipm.codec.protobuf.MultiProtobufEncoder;
import ipm.core.Protocol;

import org.jboss.netty.channel.ChannelHandler;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.handler.codec.compression.ZlibDecoder;
import org.jboss.netty.handler.codec.compression.ZlibEncoder;
import org.jboss.netty.handler.codec.protobuf.ProtobufVarint32FrameDecoder;
import
org.jboss.netty.handler.codec.protobuf.ProtobufVarint32LengthFieldPrepender;

final class PipelineFactory implements ChannelPipelineFactory {
	private final ChannelHandler frameEncoder;
	private final ChannelHandler protobufEncoder;
	private final ChannelHandler protobufDecoder;
	private final ChannelHandler requestHandler;

	public PipelineFactory(final ListenerService listenerService) {
		frameEncoder = new ProtobufVarint32LengthFieldPrepender();
		protobufEncoder = new MultiProtobufEncoder(Protocol.getResponses(),
				Protocol.HEADER_SIZE);
		protobufDecoder = new MultiProtobufDecoder(Protocol.getRequests(),
				Protocol.HEADER_SIZE);
		requestHandler = new RequestHandler(listenerService);
	}

	@Override
	public ChannelPipeline getPipeline() throws Exception {
		final ChannelPipeline pipeline = Channels.pipeline();

		pipeline.addLast("zlibDecoder", new ZlibDecoder());
		pipeline.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
		pipeline.addLast("protobufDecoder", protobufDecoder);

		pipeline.addLast("zlibEncoder", new ZlibEncoder());
		pipeline.addLast("frameEncoder", frameEncoder);
		pipeline.addLast("protobufEncoder", protobufEncoder);
		pipeline.addLast("requestHandler", requestHandler);

		return pipeline;
	}
}

messageReceived() from RequestHandler looks:

	@Override
	public void messageReceived(final ChannelHandlerContext ctx,
			final MessageEvent e) throws Exception {
		Object message = null;

		if (e.getMessage() instanceof PackageRepositoryRequest)
			message = handlePackageRepositoryRequest(ctx,
					(PackageRepositoryRequest) e.getMessage());
		else if (e.getMessage() instanceof LastPackageRepositoryUpdateTimeRequest)
			message = handleLastPackageRepositoryUpdateTimeRequest(ctx,
					(LastPackageRepositoryUpdateTimeRequest) e.getMessage());
		else if (e.getMessage() instanceof PackageRequest)
			message = handlePackageRequest(ctx, (PackageRequest) e.getMessage());

		if (message != null)
			ctx.getChannel().write(message)
					.addListener(ChannelFutureListener.CLOSE);
	}

--
View this message in context: http://netty-forums-and-mailing-lists.685743.n2.nabble.com/Memory-leak-in-ZlibEncoder-Decoder-tp6901578p6901578.html
Sent from the Netty User Group mailing list archive at Nabble.com.


More information about the netty-users mailing list