Java在不退出JVM的情况下退出程序 7 月,3 周 Questions & Answers 5593 我想退出一个java进程,并在它完成正常运行之前释放所有资源,前提是满足一定的条件。然而,我不想退出JVM,因为我有其他java程序同时运行。是return;做到了以上几点,还是有更好的方法 谢谢
# 2 楼答案 您需要理解JVM机制并澄清术语 让我们用以下内容作为术语的基础 线程是进程内并发处理流的划分 进程是操作系统级的线程。操作系统管理这些过程。通过向操作系统管理层发送终止信号来终止进程。信号可以由进程本身发送,也可以由具有适用权限的另一个进程发送 在进程内,可以创建进程级线程。进程级线程通常由操作系统的进程管理提供便利,但它们由进程启动,并由进程终止。因此,进程级线程与进程不同 应用程序是以各种形式协作的系统、程序和/或线程的集合。应用程序中的程序或进程可以在不终止整个应用程序的情况下终止 在JVM术语的上下文中,程序可能是以下内容之一 每个JVM进程运行一个程序。每个程序使用一个JVM进程,通过提供java字节码的类路径并指定类路径中的主入口点来调用。当您终止一个java程序时,运行该程序的整个jvm进程也会终止 每个进程级线程运行一个程序。例如,在tomcat或JEE服务器中运行的应用程序在JEE进程中作为线程运行。JEE进程本身就是一个使用一个JVM进程的程序。当您终止应用程序时,JEE进程不会终止 您可以在java程序中启动进程级线程。您可以编写终止线程但不会终止进程的代码(除非它是进程中最后一个也是唯一一个正在运行的线程)。JVM垃圾回收将负责释放资源,在进程级线程终止后,您不需要自己释放资源 为了便于理解,上述回答被简化了。请阅读操作系统设计和线程,以便更好地理解进程和JVM机制
# 3 楼答案 一些导致此类需求的常见用例可以通过钉枪或滴灌等工具来解决 Nailgun允许您运行命令行程序的多个独立执行,但它们都发生在同一个JVM中。因此,不必忍受重复的JVM启动时间。如果这些执行与全局状态交互,那么JVM将及时受到污染,事情开始崩溃 Drip将为每次执行使用一个新的JVM,但它始终保持一个具有正确类路径和选项的预创建JVM。这是性能较差的,但它可以通过隔离来保证正确性
# 4 楼答案 如果并发运行的其他线程不是守护进程线程,则保留main不会终止VM。其他线程将继续运行 但我完全没有抓住重点 如果在单独的JVM中启动每个程序,在其中一个JVM中调用System.exit()不会影响其他程序,它们是完全不同的进程 如果您是通过单个脚本或其他方式启动它们,这取决于它的编写方式,那么其他一些东西可能会扼杀其他进程。如果没有关于你如何启动这些应用程序的准确信息,真的很难说到底发生了什么
# 5 楼答案 @aix的答案可能正是您的问题。每次运行java命令(或等效命令)时,都会得到不同的JVM实例。在一个JVM实例中调用System.exit()不会导致其他JVM实例退出。(试试看!) 可以创建一个框架,在其中在同一个JVM中运行多个程序。实际上,当你运行一个“豆壳”时,这就是你要做的事情。当你的“程序”是在某个应用服务器框架中运行的服务(或webapps,或你管它们叫什么)时,也会发生类似的事情 坏消息是,如果你做这种事情,没有完全可靠的方法让一个单独的“程序”消失。特别是,如果程序不是为了配合而设计的(例如,如果它不检查中断),您将不得不求助于不推荐的Thread.stop()方法和friends。这些方法可能会对JVM和其中运行的其他程序产生恶劣的后果 理论上,解决这个问题的办法是使用隔离物。不幸的是,我不认为任何主流JVM都支持隔离
# 1 楼答案
每个正在运行的Java应用程序都有一个JVM进程。如果退出该应用程序,进程的JVM将被关闭。但是,这不会影响其他Java进程
# 2 楼答案
您需要理解JVM机制并澄清术语
让我们用以下内容作为术语的基础
线程是进程内并发处理流的划分
进程是操作系统级的线程。操作系统管理这些过程。通过向操作系统管理层发送终止信号来终止进程。信号可以由进程本身发送,也可以由具有适用权限的另一个进程发送
在进程内,可以创建进程级线程。进程级线程通常由操作系统的进程管理提供便利,但它们由进程启动,并由进程终止。因此,进程级线程与进程不同
应用程序是以各种形式协作的系统、程序和/或线程的集合。应用程序中的程序或进程可以在不终止整个应用程序的情况下终止
在JVM术语的上下文中,程序可能是以下内容之一
每个JVM进程运行一个程序。每个程序使用一个JVM进程,通过提供java字节码的类路径并指定类路径中的主入口点来调用。当您终止一个java程序时,运行该程序的整个jvm进程也会终止
每个进程级线程运行一个程序。例如,在tomcat或JEE服务器中运行的应用程序在JEE进程中作为线程运行。JEE进程本身就是一个使用一个JVM进程的程序。当您终止应用程序时,JEE进程不会终止
您可以在java程序中启动进程级线程。您可以编写终止线程但不会终止进程的代码(除非它是进程中最后一个也是唯一一个正在运行的线程)。JVM垃圾回收将负责释放资源,在进程级线程终止后,您不需要自己释放资源
为了便于理解,上述回答被简化了。请阅读操作系统设计和线程,以便更好地理解进程和JVM机制
# 3 楼答案
一些导致此类需求的常见用例可以通过钉枪或滴灌等工具来解决
Nailgun允许您运行命令行程序的多个独立执行,但它们都发生在同一个JVM中。因此,不必忍受重复的JVM启动时间。如果这些执行与全局状态交互,那么JVM将及时受到污染,事情开始崩溃
Drip将为每次执行使用一个新的JVM,但它始终保持一个具有正确类路径和选项的预创建JVM。这是性能较差的,但它可以通过隔离来保证正确性
# 4 楼答案
如果并发运行的其他线程不是守护进程线程,则保留
main
不会终止VM。其他线程将继续运行但我完全没有抓住重点
如果在单独的JVM中启动每个程序,在其中一个JVM中调用
System.exit()
不会影响其他程序,它们是完全不同的进程如果您是通过单个脚本或其他方式启动它们,这取决于它的编写方式,那么其他一些东西可能会扼杀其他进程。如果没有关于你如何启动这些应用程序的准确信息,真的很难说到底发生了什么
# 5 楼答案
@aix的答案可能正是您的问题。每次运行
java
命令(或等效命令)时,都会得到不同的JVM实例。在一个JVM实例中调用System.exit()
不会导致其他JVM实例退出。(试试看!)可以创建一个框架,在其中在同一个JVM中运行多个程序。实际上,当你运行一个“豆壳”时,这就是你要做的事情。当你的“程序”是在某个应用服务器框架中运行的服务(或webapps,或你管它们叫什么)时,也会发生类似的事情
坏消息是,如果你做这种事情,没有完全可靠的方法让一个单独的“程序”消失。特别是,如果程序不是为了配合而设计的(例如,如果它不检查中断),您将不得不求助于不推荐的
Thread.stop()
方法和friends。这些方法可能会对JVM和其中运行的其他程序产生恶劣的后果理论上,解决这个问题的办法是使用隔离物。不幸的是,我不认为任何主流JVM都支持隔离