RMI何时进行TCP连接?

我有一个测试程序T

  • 从服务器S上的RMI注册表获取Remote对象O的存根
  • 在数百个并行线程中,调用此对象O上的方法。

我可以看到服务器S有许多“RMI TCP连接”线程。 我原以为只有一个,因为T上只有一个O的存根。 这是如何运作的?

RMI每个线程的每个端点需要一个连接。 它在客户端汇集它们,这反过来又导致服务器端的池化,所以它实际上并没有那么糟糕,但如果你有1000个线程在同一时刻执行RMI调用,肯定会有1000个连接。 它们不是多路复用的。

如果可能的话,RMI应该尝试重用服务器套接字和客户端套接字。

当服务器套接字工厂不相等时(例如,执行equals,结果为false并再次建立连接),就会出现这种情况。 也许存根没有实现hashCode和equals,所以没有办法知道套接字是否可以使用。