Java退出程序而不退出JVM

时间:2011-04-18 10:36:12

标签: java jvm

如果满足某个条件,我想退出java进程并在完成正常运行之前释放所有资源。我不想退出JVM,因为我有其他同时运行的java程序。 return;是否执行上述操作,或者有更好的方法吗?

感谢。

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

让我们使用以下作为术语的基准。

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

  • 进程是OS级别的线程。操作系统管理进程。通过向OS管理发送终止信号来终止进程。信号可以由进程本身发送,也可以由具有适用权限的其他进程发送。

  • 在流程中,您可以创建流程级别线程。进程级线程通常由操作系统的进程管理来促进,但它们由进程启动并由进程终止。因此,进程级线程与进程不同。

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

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

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

  • 每个进程级线程运行一个程序。例如,在tomcat或JEE服务器中运行的应用程序作为JEE进程中的线程运行。 JEE流程本身就是一个消耗一个JVM流程的程序。终止应用程序时,JEE过程不会终止。

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

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

答案 2 :(得分:3)

如果并发运行的其他线程不是守护程序线程,则main不会终止VM。其他线程将继续运行。

我完全错过了这一点。

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

如果您是通过单个脚本或其他内容启动它们,则根据其编写方式,其他内容可能会杀死其他进程。如果没有关于如何启动这些应用程序的准确信息,实际上并不知道发生了什么。

答案 3 :(得分:2)

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

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

坏消息是,如果你做这种事情,没有完全可靠的方法让个人“程序”消失。特别是,如果程序不是设计为合作的(例如,如果它不检查中断),则必须使用DEPRECATED Thread.stop()方法和朋友。这些方法可能会对JVM及其中运行的其他程序产生令人讨厌的后果。

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

答案 4 :(得分:0)

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

Nailgun允许您运行似乎是命令行程序的多个独立执行,但它们都发生在同一个JVM中。因此,不必忍受重复的JVM启动时间。如果这些执行与全局状态交互,那么JVM将及时受到污染,事情就会开始分解。

Drip将为每次执行使用新的JVM,但它始终保持预先创建的JVM,并准备好正确的类路径和选项。这样性能较差,但可以通过隔离保证正确性。