2009-09-17 88 views
8

我正在执行主应用程序中的另一个JVM(java.exe)。有什么办法可以与新创建的进程(在创建时或创建之后)共享一个对象(相当大的对象)。跨Java进程共享对象

someObject sO= new someObject(); 

//sO is populated 

//Creating new process 

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

现在我想所谓对象可通过进程内对象

确实的ProcessBuilder表示的进程为此提供任何事业吗?

回答

0

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

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

+0

我正在使用编译器(Java的扩展)。我必须预处理输出不同AST的AST。为了处理这些,我必须再次调用编译器。我不想单独执行它们,我想简化这个过程。目前,我只是在新过程中重新解析原始的Java程序。我试着序列化,但是它有一个很大的对象(一个完整的程序,要精确),有很多数据结构。 – user174819 2009-09-17 08:42:32

1

您可以公开服务以允许访问来自对象的数据。使用RMI建立进程间通信相对简单。这会导致IPC的开销,所以这不会像本地访问一样具有表现性,细粒度的访问会变得昂贵,但是如果你得到摘要或其他汇总数据,那么这可能是一个体面的模型。

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

+0

我该如何'将你孩子的代码直接加入父母'。另外我不想从子进程获取数据只从父进程发送数据到子进程? – user174819 2009-09-17 08:44:06

+0

父 - >孩子,孩子 - >父母,没有区别,一个提供服务,另一个调用它。但我的主要问题是为什么他们是独立的进程?只需要一个大的流程,线程完成不同的工作。根据您的需要,您可以链接一个大型程序,或使用标准Java API动态加载类 – djna 2009-09-17 13:16:03

+0

可能会认为这是JVM体系结构模型的限制。提供缺乏这种设施的服务层变得相当困难。即使按摩传递操作系统也会使用共享对象和服务。 – will 2013-05-29 13:05:34

3

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

+0

可以使用线程来启动另一个JVM(java.exe),就像上面显示的代码一样吗?我一直看到Process被用来启动另一个JVM。 – user174819 2009-09-17 08:46:23

+0

不,你不能启动另一个JVM - 那么它将是一个进程,而不是一个线程。但是你真的需要另一个JVM吗?难道你不能只是执行main()方法而不是在线程中启动新的JVM? – 2009-09-17 08:58:41

0

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