0

我对 Java 尤其陌生,因此我的问题可能完全是 BS,但我面临着为现有 Java 应用程序创建更新程序包装器(java 应用程序)的挑战,我无法理解其中的问题。我面临的问题是,我们不想在每次必须启动一个新 jar 时启动第二个和第三个 JVM,但是步骤 5)的终止被更新程序的线程阻塞,这是从 Updater.jar 的 Classloader 开始。

概念:

  1. 当前版本的应用程序被触发以检查更新
  2. 启动 Updater.jar
  3. OnUpdateAvailable -> 关闭传入连接并保存应用程序状态及其对象
  4. 向套接字上的更新程序发送 ReadyForUpdate 信号
  5. 当前应用程序终止。
  6. 更新程序替换应用程序可执行文件和资源
  7. 更新程序启动 Application.jar 的新版本,并带有恢复到其先前状态的参数
  8. 更新程序等待 Application -> 成功初始化
  9. 更新程序终止
  10. 新版本的应用程序已启动并运行

问题:有没有办法使用相同的虚拟机先启动更新程序,然后从更新程序启动新版本的应用程序,还是应该继续使用单独的 JVM?

java版本:1.7.0_05-icedtea OpenJDK 64-Bit Server VM(build 23.0-b21,混合模式)

4

1 回答 1

0

我认为使用单独的虚拟机和包装脚本执行此操作会简单得多。

您在第 5 步的问题是它要求应用程序在不调用System.exit且不运行关闭挂钩的情况下“关闭”:

  • 可能需要对您的应用程序代码库进行重大重新设计。

  • 即使你已经这样做了,你仍然有一个问题,旧的应用程序状态可能会通过使用旧的类加载器加载的对象“徘徊”。摆脱它可能真的很困难。如果你不这样做:

    • 你有permgen泄漏,
    • 您可能有非永久内存泄漏(例如,通过已被替换的类中的静态),并且
    • 您可能会泄漏应用程序状态,这可能会导致“重新启动”应用程序出现问题。
于 2013-07-20T01:48:47.807 回答