【Netty4 简单项目实践】七、上线前准备--内存泄漏监控、系统监控

一、内存泄漏

Netty4的内存泄漏监控默认是没有的,需要手动设置。

它的内存泄漏只是针对Bytebuf,这也暗示着使用Bytebuf能提高系统性能降低GC的影响。

配置很简单,就是设置运行变量 

io.netty.leakDetection.level


        String str = Property.getProperty("io.netty.leakDetection.level");
        System.setProperty("io.netty.leakDetection.level", str);

我把探测级别放在配置文件里,在程序入口处放置上面的代码,并且确保在加载Netty4实例之前运行上面代码。

#控制内存泄漏打印的级别 DISABLED SIMPLE ADVANCED PARANOID

二、系统监控

之前说的文字处理模块现在有用武之地了:接收一串文本,输出一串文本,正好符合被动的系统监控要求,我们可以telnet到服务器的一个端口上,敲一串命令,返回服务器业务状态。
在实现的代码里面,用\r\n做分隔符来切割字符串,单独用\n也行只要把\r剔除就好,没什么影响。
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.epoll.EpollEventLoopGroup;
import io.netty.channel.epoll.EpollServerSocketChannel;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;

/**
 * 这个类作为程序的状态查询后台
 * @author yuantao
 */
public class MediaCenterServer implements Runnable{
    private int port;
    
    public MediaCenterServer(int port) {
        this.port = port;
    }
    /**
     * 1. 事件循环EventLoopGroup
     * 2. ServerBootstrap作为事件循环线程的容器
     */
    public void run(){
        String osName = System.getProperty("os.name");
        
        EventLoopGroup bossLoop = null;
        EventLoopGroup workerLoop = null;
        if (osName.equals("Linux")) {
           bossLoop = new EpollEventLoopGroup();
           workerLoop = new EpollEventLoopGroup();
        } else {
          bossLoop = new NioEventLoopGroup();
          workerLoop = new NioEventLoopGroup();
        }

        String delimiter = "\r\n";

        ByteBuf[] delimiterBytes = new ByteBuf[] {
                Unpooled.wrappedBuffer(delimiter.getBytes()) };
        try{
            ServerBootstrap bootstrap = new ServerBootstrap();
            bootstrap.group(bossLoop, workerLoop)
                .option(ChannelOption.TCP_NODELAY, true); //TCP立即发包
            if (osName.equals("Linux")) { //Linux平台用Epoll模式
                bootstrap.channel(EpollServerSocketChannel.class);
             } else {
                 bootstrap.channel(NioServerSocketChannel.class);
             }
             bootstrap.localAddress(new InetSocketAddress(port))
                .childHandler(new ChannelInitializer() {
                    @Override
                    protected void initChannel(Channel ch) throws Exception {
                        // TODO Auto-generated method stub
                        ch.pipeline().addLast("framer", new DelimiterBasedFrameDecoder( 
                                64, delimiterBytes));
                        ch.pipeline().addLast(new StringDecoder()); 
                        ch.pipeline().addLast(new StringEncoder());
                        ch.pipeline().addLast(new SystemWatcherHandler());
                    }
                });
            ChannelFuture future = bootstrap.bind(port).sync();
            if (future.isSuccess()){
                System.out.println("Monitor server on at port: " + port + ".");
            }
            future.channel().closeFuture().sync();
        } catch (Exception e) {
            
        } finally {
            for (int i=0; i

你可能感兴趣的:(netty)