在多个JVM实例中运行Java代码

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

你确定每个客户端都需要在自己的JVM上运行吗?也就是说,你不能让并发的RMI客户端在单个JVM的线程池中运行吗? - deprecated
客户端的代码中有一些静态变量,因此在同一个 JVM 实例中运行多个客户端时会出现一些冲突。 - Petros Tsialiamanis
1
我打赌你知道ThreadLocal,但和我一样懒。只需将JRE目录简单地复制N次即可。 - Joop Eggen
1
修复它们,对吧?即确保所有共享可变状态的线程安全性。 - deprecated
有数十个带有静态变量的Java文件,因此改变所有这些文件并不是非常现实的。谢谢! - Petros Tsialiamanis
2个回答

5
是的,您可以使用JDI来实现这一点 - 通过调用Bootstrap.virtualMachineManager()获取VirtualMachineManager(提供至少一个)启动连接器。然后,您可以在此连接器上调用launch(),从而为其创建的VM提供VM镜像。这个镜像让您能够在远程执行此VM上的方法。
您可以使用这种方法设置多个远程VM,不过显然这种方式会有较大的性能损失,并且需要相当大的投入。除非投入巨大,否则我个人建议修复代码以保证线程安全(使用ThreadLocal),然后就不需要担心JDI(或类似设置)了。

2

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

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


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