【问题标题】:Is there a way to completely disable RMI in a java application?有没有办法在 Java 应用程序中完全禁用 RMI?
【发布时间】: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


【解决方案1】:

您最有可能使用监控应用程序查看您的 JVM,对吧?嗯:这些监控应用程序使用 RMI。因此,您将始终在监控应用程序、分析器等中看到 RMI 线程。您将始终看到它们使用一定量的 CPU 时间。就像如果不将这些信息(通过 RMI)传输到您的工具就无法收集分析信息一样。您可以实现自己的传输协议并指示管理 bean 使用它,但我怀疑您是否可以节省足够的资源来回报您的开发成本。

如果您不使用任何 RMI,RMI 将不会启动任何线程。但是,如果您正在使用它,即使您没有意识到这一点,禁用 RMI 也意味着您的软件将不再工作。

【讨论】:

    【解决方案2】:

    StuartMarks is correct。在您使用 RMI 之前,它不会启动任何线程。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2011-01-04
      • 1970-01-01
      • 2012-07-20
      • 2017-09-19
      • 2020-03-21
      相关资源
      最近更新 更多