NioServerSocketChannel 、NioSocketChannel使用一个静态的成员变量来存放provider的原因

本文针对Netty中的SelectorProvider#provider方法导致的性能瓶颈进行了详细分析。该方法在创建每个新channel时被调用,造成不必要的阻塞。文章提出了通过存储provider结果并直接使用SelectorProvider#openSocketChannel来创建channel的方法,以此避免SocketChannel#open带来的性能损失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其实在JavaDoc标明的https://github.com/netty/netty/issues/2308中给出了一个的解释

并基于Netty4.0.18版本中给出了解释。

Currently SelectorProvider#provider (which contains synchronized block) called for every new channel creation. 
This can can cause unnecessary blocking when application creates a lot of connection (performance penalty about 1% 
when creating 5000 connections/second).
当前的SelectorProviderde provider方法,这个方法包含了一个同步代码块,每创建一个新的channel都会去调用这个方法,执行里面的同步代码块。
当应用创建许多的连接的时候,这个会导致不必要的阻塞,每秒创建5000个连接的时候,性能会下降1%
Possible solution is to store result of #provider and call java.nio.channels.spi.SelectorProvider#openSocketChannel directly, 
without SocketChannel#open.
可能的解决方案是存储provider方法的结果,然后直接用selectorProvider的openSocketChannel创建channel,而不是使用SocketChannel的open方法。
所以在Netty最近的版本中,确实对这个方案进行了实现,将provider直接设置成SocketChannel类的静态成员,并进行初始化赋值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值