有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想退出一个java进程,并在它完成正常运行之前释放所有资源,前提是满足一定的条件。然而,我不想退出JVM,因为我有其他java程序同时运行。是return;做到了以上几点,还是有更好的方法

谢谢


共 (5) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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

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

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

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

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

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

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

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

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

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

  3. # 3 楼答案

    一些导致此类需求的常见用例可以通过钉枪或滴灌等工具来解决

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

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

  4. # 4 楼答案

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

    但我完全没有抓住重点

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

    如果您是通过单个脚本或其他方式启动它们,这取决于它的编写方式,那么其他一些东西可能会扼杀其他进程。如果没有关于你如何启动这些应用程序的准确信息,真的很难说到底发生了什么

  5. # 5 楼答案

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

    可以创建一个框架,在其中在同一个JVM中运行多个程序。实际上,当你运行一个“豆壳”时,这就是你要做的事情。当你的“程序”是在某个应用服务器框架中运行的服务(或webapps,或你管它们叫什么)时,也会发生类似的事情

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

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