为什么在netty的眼里jdk的许多实现都不是非常高效?

如果有不清楚netty是什么的小伙伴可自行查询相关资料,本文不对netty进行讲解。

用一句话概括的话,Netty是一个高性能、异步事件驱动的网络应用框架,它被设计用于构建可扩展的服务器和客户端应用程序.

先说结论

我们不能脱离使用场景谈高效。JDK的设计在通用性上更好,而Netty的设计更适合高并发、网络通信的场景。

两者的区别

随便举几个例子,比较下两者实现上的区别。

1. ThreadLocal实现

就底层的哈希算法而言,ThreadLocal是基于非波拉契散列法和开放寻址,计算结果在空间分布上更加均匀。

而Netty的FastThreadLocal是基于数组下标递增,有效避免了哈希碰撞,并降低了rehash的开销,更适合高并发的场景。

2. 堆外内存释放机制

JDK提供堆外内存的封装类DirectByteBuffer,初始化时会默认开启Cleaner,作用是当DirectByteBuffer被GC时能自动调用Cleaner.clean()清理堆外内存,避免泄漏。

但Cleaner在内存分配和回收上会带来额外的性能开销。为此Netty提供了No Cleaner策略,不再创建Cleaner,而是通过retain/release操作手动释放,从而获得性能提升。

不过,或许是认识到了该策略带来的内存泄漏风险,Netty 5又将No Cleaner策略设置为默认不开启,作为可选择的高阶用法,需要通过指定JVM启动参数来开启。

3. 线程池实现

JDK的线程池内部维护了一个类型为BlockingQueue的taskqueue来保存任务队列,当线程从该队列获取任务会产生锁竞争降低性能。

Netty的解决办法是,每个channel创建时固定绑定到一个IO线程(NioEventLoop)上,其后channel上产生的IO任务也固定由这个线程处理,避免了线程池级别上的任务竞争。

不过你可能会提出疑问:除了IO任务,IO线程还会处理一些其他线程提交的异步任务和定时任务呀,在线程内部不是仍然会发生任务队列竞争吗?

原来Netty在这里使用了JCTools提供的MpscQueue(多生产者单消费者队列),它内部使用CAS避免了JDK中BlockingQueue的锁竞争,从来带来更好的性能。Netty在内部大量使用了MpscQueue,如HashedWheelTimer、Recycler、PoolThreadCache,这些场合都适合使用这种无锁非阻塞队列。

4.同步阻塞模型

JDK 标准的 java.net 包中的 Socket 和 ServerSocket API 主要是基于传统的阻塞 I/O 模型,这意味着当线程调用 read 或 write 方法时,如果数据尚未准备好或传输未完成,则线程会进入阻塞状态,无法执行其他任务,这会导致资源利用率低下,尤其是面对大量并发连接时。

5.内存管理与缓冲区复用

JDK 中直接使用 ByteBuffer 进行 I/O 操作时,每次读写操作可能都需要创建新的缓冲区实例,而 Netty 则通过 ByteBuf 实现了更高效的内存管理和缓冲区池化,减少内存分配和垃圾回收带来的开销。

6.线程模型优化

Netty 使用 Reactor 模式,结合多路复用器(Selector)来实现单线程处理多个 Channel,避免了为每个连接创建独立线程导致的上下文切换和系统资源消耗。

JDK NIO 类虽然提供了 Selector,但使用起来相对复杂且容易出错,Netty 在此基础上封装了高级抽象,简化了编程模型,并提供了一套完整的事件驱动机制。

7.零拷贝

Netty 支持 Java 的直接内存和零拷贝技术,允许数据直接从磁盘到网络堆栈之间传输,而不必经过用户空间多次复制,大大提高了数据传输效率。

8.批处理与合并小包

Netty 提供了对小包合并和批处理的支持,可以有效地减少操作系统层面的小包传输,提高整体吞吐量。

9.内置协议支持与编解码优化

Netty 内置了大量的协议支持,如 HTTP/1.x、HTTP/2、WebSocket 等,并且针对这些协议进行了性能优化,例如,通过链式编解码处理器,可以在不引入额外内存拷贝的情况下完成数据的序列化和反序列化。

综上所述:相对于标准 JDK 实现,Netty 在诸多方面都进行了深度优化和定制,从而实现了更高的性能和更低的延迟,特别适合构建高性能的网络服务应用。

以上为全部内容。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Netty并没有过时,它仍然是一种非常流行的Java网络编程框架。搜索到的大部分资料可能是旧的是因为Netty的核心概念和API已经非常稳定,不像其他一些技术那样需要经常更新。此外,因为Netty已经非常成熟,所以很多人已经使用它多年,他们创作的教程和博客仍然是非常有价值的。因此,即使搜索到的资料是较旧的,它们仍然可能是非常有用的参考资料。 ### 回答2: Netty并没有过时,仍然是一种非常流行的Java网络编程框架。原因是搜索结果主要显示以前的内容可能是由于以下几个原因: 首先,Netty最初发布于2011年,而且经历了多个版本的更新和迭代。因此,一些早期的文章和教程可能仍然在搜索结果中显示。这些文章可能会涉及旧版本的Netty,但仍然提供有用的基础知识。 其次,由于Netty在过去几年中得到了广泛认可和使用,因此有很多关于Netty的学习资源和实践案例。网络上的内容非常丰富,因此搜索结果可能会有一定的滞后。此外,一些较新的内容可能只在特定的技术博客或知识分享平台上发布,需要更具体的搜索来找到。 最后,虽然Netty是一种强大且可靠的网络编程框架,但在某些场景下,也可能有其他选择。例如,一些新的技术和框架可能在特定情况下提供更好的性能或更简单的开发体验。这可能导致一些开发者对Netty的关注度稍有下降,从而减少了更新和新的学习资料的产生。 综上所述,Netty并没有过时,仍然是一个重要的网络编程框架。搜索到的大部分内容可能是早期的,但仍然具有参考价值。为了获得更多关于Netty的最新资料和实践案例,建议查阅官方文档、技术博客和相关社区的讨论。 ### 回答3: Netty并没有过时。尽管搜索结果中可能更多地显示以前的内容,但这并不能证明Netty已经过时。实际上,Netty是一种优秀的、成熟的、广泛使用的网络编程框架,仍然受到许多公司和开发者的青睐。 有几个原因可能解释为什么搜索结果中以前的内容更多。首先,Netty经过多年来的发展和演进,已经拥有了大量的资料和文档。这些早期的资源依然对于学习和掌握Netty非常有帮助,因此仍然被广泛引用。 其次,Netty是一种稳定且功能强大的框架。尽管有一些新的网络编程框架涌现出来,但Netty仍然具有许多特性和功能,使得它继续保持流行。因此,它的使用和学习资源仍然有很大的需求。 最后,Netty的核心设计思想和编程模型并未发生重大改变,因此早期的资料和教程仍然适用于目前的版本。虽然Netty在每个版本中会有一些新的功能和改进,但它仍然延续了相同的基本原则和编码风格。 综上所述,Netty并没有过时。它是一种可靠有效的网络编程框架,仍然被广泛使用和研究。尽管搜索结果中的内容可能更多是以前的资源,但这并不能证明Netty已经过时,相反它仍然是一种被广泛使用和尊重的框架。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值