Java 同一台机器JVM之间最快的通信

Java 同一台机器JVM之间最快的通信,java,jvm,rmi,pipe,Java,Jvm,Rmi,Pipe,我需要从同一台机器上运行的另一个JVM调用一个方法。这种方法需要多次调用,并具有类似Java/native的性能。这是一种小输入小输出的方法。另一个JVM在同一台机器上运行 进行此调用并从“附近”运行的另一个JVM检索结果的最快方法是什么 一些选项可能是RMI、管道、套接字、JMS、优化的同机JVM间通信支持、JVM中的一些低级黑客。欢迎任何想法,不管它有多专业。在同一台机器上,JVM之间通信的最快方式是使用共享内存,例如通过内存映射文件。这比通过环回使用套接字快100倍。e、 g.插座的200

我需要从同一台机器上运行的另一个JVM调用一个方法。这种方法需要多次调用,并具有类似Java/native的性能。这是一种小输入小输出的方法。另一个JVM在同一台机器上运行

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


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

在同一台机器上,JVM之间通信的最快方式是使用共享内存,例如通过内存映射文件。这比通过环回使用套接字快100倍。e、 g.插座的200纳秒往返时间与10-20微秒往返时间

一个实现是顺便说一句,100 ns的延迟包括消息的持久性

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

简而言之,除非您有特定的、可测量的延迟和/或吞吐量需求,否则您应该假设最简单的解决方案就是您真正想要的。如果您对所需内容有了更好的理解,则可以用更快的方式来代替。另一种可能是,尽管这取决于您所说的“最快”的含义,zeromq对于吞吐量来说是非常好的,但如果您绝对必须具有尽可能低的延迟,则它可能不是最佳的


ZeroMQ对于两个JVM来说可能是多余的,但是它的优势是,如果您以后想将其中一个JVM移动到另一台机器上,或者与非Java进程通信,ZeroMQ仍然可以正常工作—并且可以扩展到更大的规模,更复杂的沟通。

JMX高效且易于实现@Nambari的可能重复问题,但我不同意答案。;)@AssenKolov JMX很容易实现,但即使是它最好的朋友也不会说它是高效的。RMI上的反射层,有效吗?谢天谢地,并不是每个人都是stackoverflow上的强制关闭者。我得到了非常好的答案。谢谢!比套接字快100倍就足够快了。现在来看看实现的复杂性。我知道Java 1.4中有一些内存映射支持。JNI不是一个选项。您仍然需要首先对您的需求有一个清晰的概念,但因为您似乎不想这样做;)我已经添加了这样一个库的链接,在决定下一步做什么之前,我需要自己分析内存映射的JVM间通信。我的要求非常明确,但我选择不公开分享,因为它们不相关且可能敏感。最快就是最快。如果内存映射是最快的方法,但仍然不符合要求,那么JVM之间的通信将继续进行,并寻求其他选择。我将检查我们的您的库,如果它不使用JNI,我将使用它。谢谢!它可以选择使用JNI或JNA作为线程亲和力来最小化抖动,但这在另一个库中,不是必需的。我经常遇到有“巨大”需求的项目,但归根结底,任何像样的解决方案都可以。JNI可能会使JVM崩溃。崩溃(JIT编译器错误除外)在我的设置中是不可容忍的。所以我们谈论的是巨大的输入/输出?这也可能是有用的。谢谢ZeroMQ的往返延迟约为30微秒。如果这个延迟是正常的,那么它可能比其他选择要好。