2011-04-18 181 views
1

如果满足某个条件,我想退出Java进程并在完成正常运行之前释放所有资源。我不想退出JVM,因为我有其他的Java程序在同一时间运行。 return;是否做到了上述要求,还是有更好的方法来做到这一点?Java退出程序而不退出JVM

谢谢。

回答

2

@ aix的答案可能适合您的问题。每次运行java命令(或等效命令)时,都会得到不同的JVM实例。在一个JVM实例中调用System.exit()不会导致其他JVM实例退出。 (试一下吧!)

是可能的创建一个框架,你可以在同一个JVM中运行多个程序。事实上,当你运行一个“豆壳”时,这实际上就是你所做的。当你的“程序”是在一些应用服务器框架中运行的服务(或webapps,或者你称之为的任何东西)时,会发生同样的事情。

坏消息是,如果你这样做,没有完全可靠的方法让个人“程序”消失。特别是,如果程序不是设计为合作的(例如,如果程序没有检查中断),你将不得不诉诸于DEPRECATED Thread.stop()方法和朋友。而这些方法可能会对JVM和其中运行的其他程序产生不良后果。

理论上,解决这个问题的方法是使用Isolates。不幸的是,我不认为任何主流的JVM都支持Isolates。

+0

是的,现在我只是单独启动它们,现在它吃了更多的RAM。在多线程系统中,你可以执行'join()',但不知道除了单独的初创公司该怎么做。 – Sigtran 2011-04-18 11:11:06

+0

做一个'join()'只有在“程序”合作的情况下才有效;例如定期检查它是否被打断。 – 2011-04-18 11:16:01

9

每个正在运行的Java应用程序都有一个JVM进程。如果您退出该应用程序,则进程的JVM将关闭。但是,这不会影响其他Java进程。

+0

我开始他们作为服务在Debian linux下,似乎如果我'System.exit();'其中一个,其他人将退出以及...我可能必须启动它们作为单独的Java程序..现在会尝试。感谢您的快速回复。那么,“回报”会产生什么效果呢? – Sigtran 2011-04-18 10:48:31

3

如果其他正在同时运行的线程不是守护进程线程,则不会终止该虚拟机。其他线程将继续运行。

虽然我完全错过了这一点。

如果您在单独的JVM中启动每个程序,在其中一个调用System.exit()不会影响其他程序,它们是完全不同的进程。

如果您是通过单个脚本或其他东西来启动它们,具体取决于它如何写入,则可能会杀死其他进程。如果没有关于如何启动这些应用程序的准确信息,则完全不知道发生了什么。

+0

是的,那是真的,谢谢。我不运行它们作为线程,这些是单独的程序,作为服务@启动启动..他们似乎都在同一时间退出..见上文。 – Sigtran 2011-04-18 10:51:21

+0

它们是由相同的服务(另一个Java程序)启动的 - >似乎所有的JVM都运行在同一个JVM中。只是做了一个脚本,分别启动他们@引导,它按预期工作。谢谢您的帮助。 – Sigtran 2011-04-18 11:03:01

4

您需要了解JVM机制并澄清术语。

让我们使用以下作为术语的数据。

  • 线程是进程内并发处理流程的分支。

  • 进程是一个OS级别的线程。操作系统管理这些进程。通过向OS管理器发送终止信号终止进程。该信号可以由进程本身或具有适用特权的另一进程发送。

  • 在一个流程中,您可以创建流程级别的线程。进程级别的线程通常由OS的进程管理提供便利,但它们由进程启动并由进程终止。因此,进程级线程与进程不一样。

  • 应用程序是以各种形式合作的系统,程序和/或线程的集合。应用程序中的程序或进程可以终止而不终止整个应用程序。

在JVM术语的上下文中,程序可以是下列之一。

  • 程序按每个JVM进程运行。每个程序使用一个JVM进程,并通过提供java字节码的类路径并指定在类路径中找到的主入口点来调用。当你终止一个Java程序时,运行该程序的整个jvm进程也会终止。

  • 程序按进程级别线程运行。例如,在tomcat或JEE服务器中运行的应用程序在JEE进程中作为线程运行。 JEE进程本身就是一个使用一个JVM进程的程序。当您终止一个应用程序时,JEE进程不会终止。

您可以在java程序中启动进程级线程。你可以编写终止线程的代码,但不会终止进程(除非它是进程中最后一个也是唯一运行的线程)。 JVM垃圾回收将负责释放资源,并且在进程级别线程终止后您不需要自己释放资源。

为了理解,上述响应被简化了。请阅读OS设计和线程,以便更好地理解进程和JVM机制。

+0

是的,似乎我需要阅读线程/服务器体系结构和操作系统设计 - 我不知道单独启动java程序会创建单独的JVM ...我宁愿在一个JVM中启动它们以节省一些内存,但它是另一天的工作。猜猜当我更好地理解它们应该如何工作以及如何终止一个线程(?)而不终止所有这些程序时,我会重新连接这些特定的程序。 – Sigtran 2011-04-18 11:44:18

0

导致这些需求的一些常见用例可以通过Nailgun或Drip等工具解决。

Nailgun允许您运行似乎是多个独立执行的命令行程序,但它们都发生在同一个JVM中。因此重复的JVM启动时间不一定需要忍受。如果这些执行与全局状态相互作用,那么JVM将被及时污染,并且事情开始崩溃。

Drip将为每次执行使用一个新的JVM,但它始终保留一个预先创建的JVM,并且准备好正确的类路径和选项。这不是高性能,但它可以通过隔离来保证正确性。