当前位置: 首页 > 面试题库 >

如何像Unix风格的exec那样替换当前的Java进程?

艾仲渊
2023-03-14
问题内容

我有一台用Java编写的服务器,它可以作为Windows服务运行(感谢Install4J)。我希望该服务能够下载其运行的最新版本的JAR文件,并开始运行新代码。令人难忘的是,我不希望Windows服务完全退出。

理想情况下,我将通过unix风格的exec()调用来完成此操作,以停止当前版本并运行新版本。我怎样才能最好地做到这一点?


问题答案:

这是一种复杂但可移植的方法。

将您的代码分成两个jar。一个很小的jar只是用来管理流程启动的。它创建一个ClassLoader,将另一个jar保留在其classpath上。

当您要加载新版本时,您将终止所有从旧jar运行代码的线程。从旧的jar中删除对类实例的所有引用。取消所有对加载旧jar的ClassLoader的引用。在这一点上,如果您什么都没错过,那么旧的类和ClassLoader应该可以进行垃圾回收了。

现在,您从指向新jar的新ClassLoader实例开始,然后重新启动应用程序代码。



 类似资料:
  • 译者:bdqfork 作者: Alexis Jacq 简介 本教程主要讲解如何实现由Leon A. Gatys,Alexander S. Ecker和Matthias Bethge提出的 Neural-Style 算法。Neural-Style或者叫Neural-Transfer,可以让你使用一种新的风格将指定的图片进行重构。这个算法使用三张图片,一张输入图片,一张内容图片和一张风格图片,并将输入

  • 在Java中,我们可以使用以毫秒为单位获取自epoch时间以来的当前时间戳,该时间戳是- 当前时间与世界协调时1970年1月1日午夜之间的差值,以毫秒为单位。

  • 问题 你想通过数据集合动态的生成交替背景色的列表. 方案 Give templetor access to the int built-in and use modulo to test. code.py web.template.Template.globals['int'] = int template.html <ul> $var i: 0 $for track in tracks:

  • 但是,使用下面的代码,我只需将列表中第一个项的项号追加到每个项,而不是为每个项添加不同的项号。

  • 问题内容: Swift 2.2不推荐使用C风格的循环。但是在某些情况下,新的范围运算符可能无法正常工作。 和 后者将在运行时失败。我可以用来包装循环,但有点混乱。有时,这种循环很有用。 有什么想法吗? 用例 您需要枚举数组中除最后一个元素之外的所有元素。 您需要枚举十进制范围内的所有整数,但范围可以是[0.5,0.9],因此没有整数(经过一些数学运算),这将导致空循环。 问题答案: 尽管它不是“漂

  • 问题内容: 我想替换图像的颜色。例如,将所有蓝色变为红色而形状没有任何变形。当我尝试这样做时,我可以通过迭代每个像素来交换颜色,但是交换区域的形状变为平坦的形状。 example1输入:http: //www.tutorialwiz.com/tutorials/changing_color/images/original.jpg example1输出:http : //www.tutorialwi