Java在不退出JVM的情况下退出程序

Java在不退出JVM的情况下退出程序,java,jvm,Java,Jvm,如果满足某个条件,我想退出java进程并在它完成正常运行之前释放所有资源。然而,我不想退出JVM,因为我有其他java程序同时运行。是否返回执行上述操作,还是有更好的方法 谢谢。每个正在运行的Java应用程序都有一个JVM进程。如果退出该应用程序,进程的JVM将关闭。但是,这不会影响其他Java进程。如果同时运行的其他线程不是守护进程线程,则离开main不会终止VM。其他线程将继续运行 但我完全没有抓住要点 如果在单独的JVM中启动每个程序,在其中一个JVM中调用System.exit()不会影

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


谢谢。

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

如果同时运行的其他线程不是守护进程线程,则离开
main
不会终止VM。其他线程将继续运行

但我完全没有抓住要点

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


如果您是通过单个脚本或其他方式启动它们,这取决于它的编写方式,那么其他一些方式可能会扼杀其他进程。如果没有关于如何启动这些应用程序的准确信息,就无法知道发生了什么。

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

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

坏消息是,如果你做这种事情,没有完全可靠的方法让一个单独的“程序”消失。特别是,如果程序不是设计为协作的(例如,如果它不检查中断),您将不得不求助于不推荐的
Thread.stop()
方法和friends。这些方法可能会对JVM和运行在JVM中的其他程序产生恶劣的后果


理论上,解决这个问题的办法是使用隔离物。不幸的是,我认为没有任何主流JVM支持隔离。

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

让我们使用以下内容作为术语的基础

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

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

  • 在进程内,您可以创建进程级线程。进程级线程通常由操作系统的进程管理提供便利,但它们由进程启动并由进程终止。因此,进程级线程与进程不同

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

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

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

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

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


为便于理解,对上述回答进行了简化。请阅读操作系统设计和线程,以便更好地理解进程和JVM机制。

一些导致此类需求的常见用例可以通过工具(如Nailgun或Drip)解决

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


将为每次执行使用一个新的JVM,但它始终保留一个具有正确类路径和选项的预创建JVM。这性能较差,但可以通过隔离来保证正确性。

我在Debian linux下将它们作为服务启动&如果我
System.exit()其中一个,其余的也将退出。。。我可能不得不在启动时将它们作为单独的java程序启动。。我现在就试试。谢谢你的快速回复。那么,
将返回什么效果运行程序上的make?是的,这是真的,谢谢。我不以线程的形式运行它们,它们是独立的程序,以service@boot.的形式启动。。他们似乎都在同一时间离开。。如上所述,它们都是由同一个服务(另一个java程序)启动的-->似乎都在同一个JVM中运行。只需编写一个脚本,在@boot单独启动它们,就可以正常工作了。谢谢你的帮助。是的,现在我只是单独启动它们,虽然它现在占用了更多的内存。在一个