java - 同机 JVM 之间最快的通信

标签 java jvm rmi pipe

<分区>

我需要从运行在同一台机器上的另一个 JVM 调用一个方法。此方法需要以类似 Java/ native 的性能调用很多次。是一种小投入小产出的方法。另一个 JVM 在同一台机器上运行。

进行此调用并从“附近”运行的其他 JVM 检索结果的最快方法是什么?

一些选项可能是 RMI、管道、套接字、JMS、优化的同机 JVM 间通信支持、JVM 中的一些低级 hack。欢迎任何想法,无论它有多专业。

最佳答案

在同一台机器上的 JVM 之间进行通信的最快方式是使用共享内存,例如通过内存映射文件。这比使用 Socket over loopback 快 100 倍。例如200 纳秒的往返时间与 10-20 微秒的套接字往返时间。

一个实现是Java Chronicle顺便说一句,100 纳秒的延迟包括消息的持久性。

您不应该想当然地认为您是否需要这些解决方案中的任何一个。通常当人们说他们必须拥有“最快的”时,他们的意思是他们不知道需要多快,所以如果他们选择最快的,那应该是正确的解决方案。这通常是不正确的,因为采用最快的解决方案通常意味着在设计和实现中做出妥协,如果您知道真正的需求是什么,那么这些妥协可能永远不需要。

简而言之,除非您有特定的、可测量的延迟和/或吞吐量要求,否则您应该假设最简单的解决方案是您真正想要的。如果您对所需内容有了更好的了解,但发现它不合适,可以用更快的东西替换它。

关于java - 同机 JVM 之间最快的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482130/

相关文章:

java - 选择在 Ubuntu 中使用哪个 JVM

java - 为什么 SoftReference 仍然出现 Out Of Memory?

java - 如何实现 Java RMI 获取未连接的客户端 IP/主机名

java - 通过 RMI 调用接收代理作为参数时如何获取真实对象?

java - 确定用于 Java RMI 调用的远程客户端 IP 地址

java - 为什么静态初始化器中带有 lambda 的并行流会导致死锁?

java - 在更新查询中添加几列

java - 从 TCP 套接字读取的最有效方法

java - 使用 Java 创建自定义 UI 元素

java - 如何从 java 中重新启动 java 程序?