有没有一种方法可以完全禁用Java应用程序中的RMI?

4
在我们的应用程序中,使用基于Netty的自有命令分发系统解决了远程过程调用问题。我们有很多模块(约20个),我想在单独的JVM中运行所有模块。我的问题是,每个JVM的RMI会生成约17个线程,但据我所知,我根本不需要使用RMI。
我能否完全禁用JVM的RMI?或者至少以不使用这么多线程的方式进行配置?

5
如果您没有使用RMI,那些线程就不会执行任何工作。这听起来像是过早的优化。 - Thorn G
1
谢谢你的回答,汤姆。在一台机器上运行20个JVM,有340个未使用的线程。这已经可以在负载上看到了。我真的不明白为什么RMI需要17个未使用的线程。这是“过度优化” :) - Sobvan
1
@Szobi 所以有340个睡眠线程,它们对你的性能产生影响的唯一方式是如果你正在运行32位Java并且虚拟地址空间不足。如果不是这种情况,那么你认为这些线程会对你做什么? - Voo
1
@Szobi 或许你应该提供一些关于你观察到的负载的证据 -- 可以是来自 VisualVM 的性能分析结果,或者线程转储等类似的信息。 - Thorn G
我不希望这个问题走向“过早优化”的方向。我想知道是否可以关闭RMI。如果我不需要Java的某个功能,为什么非得使用它呢? - Sobvan
3
这些是哪些线程?除非有人实际使用RMI,否则RMI不会产生任何线程。您有证据表明这些线程实际上是RMI线程吗?它们的名称是什么?一个典型的JVM默认运行几个服务线程。例如,在我的系统(Mac 7u25 64位)上运行一个什么也不做只睡眠的程序有11个线程,包括一些GC线程、信号处理程序、finalize线程、引用处理程序等,加上主线程。如果在JVM中执行实际工作,则17个线程是很可能的,这可能与RMI无关。 - Stuart Marks
2个回答

6
您很可能正在使用监控应用程序查看您的JVM,对吗?嗯:这些监控应用程序使用 RMI。因此,您将始终在监控应用程序、分析器等中看到RMI线程。您还将始终看到它们使用一定量的CPU时间。就像收集分析信息无法在未通过RMI将这些信息传输(到您的工具)的情况下完成一样。您可以实现自己的传输协议并指示管理bean使用它,但我怀疑您是否可以节省足够的资源以弥补开发成本。
如果您不使用任何RMI,则RMI不会启动任何线程。但是,如果您正在使用它,即使您不知道这一点,禁用RMI意味着您的软件将无法正常工作。

3

StuartMarks是正确的。RMI在你使用它之前不会启动任何线程。

可能你正在以某种你不知道的方式使用它,比如JMX?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接