替代Java选择器实现



我正在写高性能/低垃圾应用(微秒问题(具有网络组件。我遇到的酸痛点之一是实现Java Nio的内置选择器。

一些有问题的事情:

  • 许多对象创建。几乎每个呼叫selectedkeys((创建了许多对象。迭代器,拳击/拆箱,您可以命名。对于大多数其他情况而言,这不是问题,但是我正在编写的应用需要创建尽可能小的垃圾。
  • 在锁定和同步的层上层。在构建选择性iMpls时,不存在一堆Java锁定原始图。结果,它很笨拙,不是最佳的。在我的用例中,只有一个线程调用select,因此锁定实际上是毫无用处的。

扩展或更改选择器实现是一个非开始者。大多数课程都是最终的,私人和软件包 - 私有会员位于sun.nio.ch.*软件包中。天然方法也使事物复杂化。

是否还有其他可能更具性能的现代实现?

我检查的网络库只需在封面下使用内置的Java选择器即可。任何帮助将不胜感激。

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

Netty项目具有使用本机Epoll Edge触发传输的实现:

自4.0.16以来,Netty使用JNI提供了Linux的本机套接字传输。该运输的性能较高,造成较少的垃圾[...]

可能是您的一个可能的缺点,仅在Linux上可用。

在积极方面,Netty是一个开源项目,可能是源代码会给您一两个提示。

涉及有关大量对象创建的第一点,您可以使用Java11中引入的选择方法来改善,那些接受操作消费者作为参数的方法。

在Java11之前,每次调用Select((方法时,您都必须调用Iterator((访问事件。这将创建一个新的迭代对象,该对象将受到垃圾收集的影响。不幸的是,这是在接口(抽象基类(本身中所构成的。

新方法本身会迭代事件本身,应用您的动作并减少垃圾。

这是新方法的Javadoc:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java.base/java/java/nio/nio/channels/channels/selector.html#select(java.util.function.consumer,long(

最新更新