8

我正在从主应用程序执行另一个 JVM (java.exe)。有没有办法与新创建的进程(在创建时或创建后)共享对象(相当大的对象)。

someObject sO= new someObject();

//sO is populated

//Creating new process

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("java  -cp " + tempDir +  jarsInPath  + " " + appMain);

现在我希望 proc 对象表示的进程可以使用 sO 对象

ProcessBuilder 是否为此提供任何实用程序?

4

4 回答 4

3

如果要共享对象,最好的方法是使用线程而不是单独的进程。进程不能共享内存(通过 JNI 除外),因此您必须通过文件或 RMI 套接字连接以序列化形式来回复制大对象(后者是更好的选择,因为它会导致固有同步) .

于 2009-09-17T08:32:58.017 回答
1

您可以公开服务以允许访问来自对象的数据。使用 RMI 设置进程间通信相对简单。将会有 IPC 开销,因此这不会像本地访问那样性能好,细粒度访问会变得昂贵,但是如果您要获取摘要或其他聚合数据,那么这可能是一个不错的模型。

你没有说为什么这些是单独的过程。您是否有机会将子进程的代码直接加载到父进程中?动态装载和卸载是可能的。

于 2009-09-17T08:32:43.297 回答
0

不,Java 中没有共享内存支持。

解决这个问题的最简单方法是将对象序列化为临时文件,然后将其反序列化回新的 JVM。

于 2009-09-17T08:27:10.613 回答
0

我认为您可以为此目的使用分布式缓存(EHCache、memcached 等等......)

于 2009-09-17T10:12:49.580 回答