0

次のコードでは、9184 バイトのメモリがリークしています。

メインクラス:

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.timeout.IdleStateHandler;
import org.jboss.netty.util.HashedWheelTimer;
import org.jboss.netty.util.Timer;


    public class NettyMemoryLeakTest {

        public static void main(String[] args) {
            final Timer timer = new HashedWheelTimer();
            final IdleStateHandler idle = new IdleStateHandler(timer, 0, 0, 1);
            final ChannelFactory cf = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());
            final ServerBootstrap bootStrap = new ServerBootstrap(cf);
            final ServerHandler objServerHandler = new ServerHandler();
            bootStrap.setPipelineFactory(new ChannelPipelineFactory() {
                @Override
                public ChannelPipeline getPipeline() throws Exception {
                    ChannelPipeline pipeline = Channels.pipeline();
                    pipeline.addLast("IDLE", idle);
                    pipeline.addLast("Handler", objServerHandler);
                    return pipeline;

                }
            });

            bootStrap.bind(new InetSocketAddress(8080));

        }
    }

ハンドラー:

import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.timeout.IdleState;
import org.jboss.netty.handler.timeout.IdleStateAwareChannelHandler;
import org.jboss.netty.handler.timeout.IdleStateEvent;

public class ServerHandler extends IdleStateAwareChannelHandler {

    @Override
    public void channelIdle(ChannelHandlerContext ctx, IdleStateEvent e) {
        if (e.getState() == IdleState.ALL_IDLE) {

            System.gc();

        }
    }
}

jdk 1.7、netty 3.5.8 を使用しています。最終的には、netbeans プロファイラーを介してメモリ リークをチェックしています。記憶の変化を表しています。使用したメモリ

AFTER 48 分漏れは2020kb です。問題を解決するために私を助けてください

ありがとうございました。

4

1 に答える 1

0

System.gc()は、GCを実行することをまったく保証しません。本当にメモリリークだと思われる場合は、バイナリ形式のヒープダンプを取得し、検査用に提供してください。

于 2012-11-23T05:50:09.923 に答える