【问题标题】:Run java code in multiple jvm instances在多个 jvm 实例中运行 java 代码
【发布时间】:2013-05-18 19:40:27
【问题描述】:

我有一个 Windows 服务应用程序和一个使用 RMI 与服务通信的客户端。 我需要对多个客户端进行一些并发测试,但我需要每个客户端运行到不同的 jvm 实例,因为它的代码中有一些静态变量。 我可以这样做吗?有任何想法吗?

【问题讨论】:

  • 您确定需要每个客户端在自己的 JVM 上运行吗?也就是说,你不能让并发 RMI 客户端在单个 JVM 的线程池中运行吗?
  • 客户端代码中有一些静态变量,所以当我在同一个 jvm 实例中运行多个客户端时会出现一些冲突。
  • 我敢打赌你知道 ThreadLocal,但和我一样懒惰。只需复制 JRE 目录 N 次即可。
  • OP:那么修复它们对吗?即确保所有共享可变状态的线程安全。
  • 有几十个带有静态变量的java文件,把这些文件都改掉不太现实。谢谢! – user1540341

标签: java testing concurrency jvm


【解决方案1】:

是的,您可以使用 JDI 执行此操作 - VirtualMachineManager(您可以通过调用 Bootstrap.virtualMachineManager(); 获得)提供(至少一个)launching connector。然后,您可以在此连接器上调用 launch();,它会为您创建的 VM 提供 VM mirror。然后,此镜像允许您在此 VM 上远程执行方法。

您可以使用此方法设置任意数量的远程虚拟机,但显然这样做会带来相对较大的性能损失,而且需要付出相当大的努力。除非付出巨大的努力,否则我个人建议修复代码以保证线程安全(使用 ThreadLocal),然后您就无需担心 JDI(或类似设置)。

【讨论】:

    【解决方案2】:

    您可以使用 shell 脚本在循环中使用自己的一组参数生成一个新客户端。

    但是,总的来说。仅仅因为共享一些静态变量而在多个 VM 中运行客户端代码绝对不是一个好的解决方案。 根本问题在于您的客户端代码,正如已经建议的那样,您可以使用ThreadLocalThreadPools 或一些同步逻辑来隔离不同客户端线程之间的一组变量。

    【讨论】:

      猜你喜欢
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2021-02-01
      相关资源
      最近更新 更多