替代 Java 选择器实现

2022-09-04 04:23:00

我正在编写一个高性能/低垃圾应用程序(微秒级),其中包含一个网络组件。我遇到的一个痛点是Java NIO内置Selector的实现。

一些有问题的事情:

  • 大量的对象创建。几乎每次调用 selectedKeys() 都会创建很多对象。迭代器,装箱/取消装箱,你的名字。对于大多数其他情况来说不是问题,但是我正在编写的应用程序需要创建尽可能少的垃圾。
  • 层层叠加锁定和同步。在构建选择器Impls时,一堆Java锁原语并不存在。因此,它很笨拙,不是最佳的。在我的用例中,只有一个线程调用,因此锁定实际上是无用的。select

扩展或更改选择器实现是一个非启动器。大多数类都是最终类,私有和包私有成员位于包中。本机方法也使事情复杂化。sun.nio.ch.*

是否有任何其他更现代的选择器实现可能更高性能?

我检查过的网络库只是在幕后使用内置的Java选择器。任何帮助将不胜感激。


答案 1

也许这个库满足了你的需求?我自己没有用过,但看起来很有希望。http://www.coralblocks.com/index.php/the-simplicity-of-coralreactor/


答案 2

Netty 项目有一个使用 Native epoll 边缘触发传输的实现:

从 4.0.16 开始,Netty 使用 JNI 为 Linux 提供本机套接字传输。这种运输具有更高的性能,并产生更少的垃圾[...]

对你来说,一个可能的缺点可能是,它仅在Linux上可用。

从积极的一面来看,Netty是一个开源项目,可能源代码会给你一两个提示。


推荐