2012-11-20 46 views
4

我需要从运行在同一台机器上的另一个JVM调用一个方法。这种方法需要用Java/native-like的性能进行非常多的调用。这是一个小输入小输出方法。另一个JVM在同一台机器上运行。同机JVM之间的最快通信

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

某些选项可能是RMI,管道,套接字,JMS,一种优化的同机JVM间通信支持,以及JVM中的一些低级别攻击。任何想法都是受欢迎的,不管它有多专业。

+2

JMX高效且易于实现 –

+0

可能的重复[在同一台机器上两个JVM进行通信的最快方式是什么?](http://stackoverflow.com/questions/13425485/what-is-the-最快的方式为两个jvms在同一机器沟通) – kosa

+1

@Nambari一个重复的问题,但我不同意答案。 ;) –

回答

5

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

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

您是否需要这些解决方案中的任何一种都不应视为理所当然。通常当人们说他们必须拥有“最快”的时候,他们真的意味着他们不知道需要多快,所以如果他们选择最快的话,那应该是正确的解决方案。这通常是不正确的,因为采用最快的解决方案通常意味着在设计和实施中做出妥协,如果只知道需求真的是什么,它可能会变成不需要的。总之,除非您有特定的,可测量的延迟和/或吞吐量要求,否则您应该假设最简单的解决方案就是您真正想要的。这可以用更快的东西代替,如果你对所需要的东西有更好的理解,它就不适用了。

+0

谢谢!速度比套接字快100倍。现在来看看执行的复杂性。我明白在Java 1.4中有一些内存映射支持。 JNI不是一种选择。 – Nick

+0

您仍然需要首先清楚地了解您的需求,但是因为您似乎并不想这么做;)我已经添加了一个链接到这样的库。 –

+0

在我决定下一步做什么之前,我需要自己剖析内存映射的JVM间通信。我的要求非常明确,但我选择不要公开分享它们,因为它们无关紧要且可能敏感。最快速度最快。如果内存映射是最快的方法并且仍然不适合账单,那么JVM之间的通信就会开始,并且其他选项也会被执行。我会检查我们的库,如果它不使用JNI,我会使用它。非常感谢! – Nick

1

另一种可能性是0MQ (ZeroMQ),虽然这取决于你所说的“最快”的意思 - zeromq为吞吐量是优秀的,但如果你绝对必须有尽可能低的延迟它可能不是最优的。

ZeroMQ对于只有两个JVM而言可能会过量,但具有如果您稍后想要将其中一个JVM移动到另一台机器或与非Java进程通信的优势,ZeroMQ仍然可以正常工作 - 更大规模,更复杂的通信。

+0

所以我们在谈论巨大的输入/输出?这也可能有用。谢谢! – Nick

+0

ZeroMQ的往返行程约为30微秒。如果这个延迟是好的,它可能比替代品更好。 –