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