【问题标题】:Sharing objects across Java processes跨 Java 进程共享对象
【发布时间】:2010-11-29 01:49:02
【问题描述】:

我正在从主应用程序执行另一个 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 是否为此提供任何实用程序?

【问题讨论】:

    标签: java process ipc processbuilder


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 可以使用一个线程来启动另一个JVM(java.exe),就像上面显示的代码一样吗?我一直看到 Process 被用来启动另一个 JVM。
      • 不,您不能启动另一个 JVM - 那么它将是一个进程,而不是一个线程。但是你真的需要另一个 JVM 吗?难道你不能只执行你在线程中启动新 JVM 的 main() 方法吗?
      • 我一直在阅读 Terracotta 可以跨 JVM 共享对象:stackoverflow.com/questions/63926180/…
      【解决方案3】:

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

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

      【讨论】:

      • 我如何'将子进程的代码直接加载到父进程中'。另外我不想从子进程获取数据只从父进程发送数据到子进程?
      • Parent->child, child->parent,没有区别,一个提供服务,另一个调用它。但我的主要问题是为什么它们完全是独立的进程?只要有一个大进程,线程做不同的工作。根据您的需要,您可以只链接一个大程序,或使用标准 Java API 动态加载类
      • 有人可能会认为这是 JVM 架构模型的限制。提供缺乏这种设施的服务层变得相当困难。甚至按摩传递操作系统也会使用共享对象和服务。
      【解决方案4】:

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

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

      【讨论】:

      • 我正在使用编译器(Java 的扩展)。我必须预处理输出不同 AST 的 AST。为了处理这些,我必须再次调用编译器。我不想单独执行它们,而是想简化这个过程。目前,我只是在新进程中重新解析原来的java程序。我尝试了序列化,但它是一个包含许多数据结构的相当大的对象(准确地说是一个完整的程序)。
      猜你喜欢
      • 2010-10-20
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 2012-01-31
      • 2012-07-22
      • 1970-01-01
      相关资源
      最近更新 更多