【发布时间】:2013-10-04 11:32:31
【问题描述】:
在我们的应用程序中,远程过程调用是通过自己的基于 netty 的命令调度系统解决的。我们有很多模块(大约 20 个),我想在单独的 jvm-s 中运行所有模块。我的问题是,RMI 为每个 JVM 生成大约 17 个线程。我根本不需要 RMI(据我所知)。
我可以完全禁用 jvm 的 RMI 吗?或者至少以不使用这么多线程的方式对其进行配置?
【问题讨论】:
-
如果您不使用 RMI,这些线程不会执行任何工作。这听起来像是过早的优化。
-
感谢汤姆的回答。在一台机器上运行 20 个 jvm 时,有 340 个未使用的线程。这已经可以在负载上看到。我真的不明白为什么 RMI 需要 17(!)个未使用的线程。这是“后成熟”优化:)
-
@Szobi 所以有 340 个休眠线程,它们影响性能的唯一方法是在 32 位 Java 下运行并且虚拟地址空间不足。如果不是这样,您认为这些线程到底会对您做什么?
-
@Szobi 也许你应该提供一些关于你正在观察的负载的证据——来自 VisualVM 或线程转储或类似的分析结果。
-
这些是什么线程?除非有人实际使用 RMI,否则 RMI 不会产生任何线程。您是否有任何证据表明这些线程实际上是 RMI 线程?他们的名字是什么?典型的 JVM 默认运行多个服务线程。例如,在我的系统(Mac 7u25 64 位)上运行一个除了睡眠什么都不做的程序有 11 个线程,包括几个 GC 线程、一个信号处理程序、一个终结器、一个引用处理程序等,加上主线程。如果你在 JVM 中做实际工作,17 个线程是相当合理的,这可能与 RMI 无关。
标签: java multithreading jvm rmi