SOMAXCONN = AccessController.doPrivileged(new PrivilegedAction<Integer>() { @Override public Integer run(){ // Determine the default somaxconn (server socket backlog) value of the platform. // The known defaults: // - Windows NT Server 4.0+: 200 // - Linux and Mac OS X: 128 int somaxconn = PlatformDependent.isWindows() ? 200 : 128; File file = new File("/proc/sys/net/core/somaxconn"); BufferedReader in = null; try { // file.exists() may throw a SecurityException if a SecurityManager is used, so execute it in the // try / catch block. // See https://github.com/netty/netty/issues/4936 if (file.exists()) { in = new BufferedReader(new FileReader(file)); // 将somaxconn设置为Linux配置文件中设置的值 somaxconn = Integer.parseInt(in.readLine()); if (logger.isDebugEnabled()) { logger.debug("{}: {}", file, somaxconn); } } else { ... } ... } // 返回backlog的值 return somaxconn; } }
// 选择ALLOCATOR参数,设置SocketChannel中分配的ByteBuf类型 // 第二个参数需要传入一个ByteBufAllocator,用于指定生成的 ByteBuf 的类型 new ServerBootstrap().childOption(ChannelOption.ALLOCATOR, new PooledByteBufAllocator());
ByteBufAllocator类型
池化并使用直接内存
1 2
// true表示使用直接内存 new PooledByteBufAllocator(true);
池化并使用堆内存
1 2
// false表示使用堆内存 new PooledByteBufAllocator(false);
非池化并使用直接内存
1 2
// ture表示使用直接内存 new UnpooledByteBufAllocator(true);
非池化并使用堆内存
1 2
// false表示使用堆内存 new UnpooledByteBufAllocator(false);
RCVBUF_ALLOCATOR
属于 SocketChannal 参数
控制 Netty 接收缓冲区大小
负责入站数据的分配,决定入站缓冲区的大小(并可动态调整),统一采用 direct 直接内存,具体池化还是非池化由 allocator 决定