复习-JVM何时结束

Java虚拟机的退出规则 :JVM在所有非守护线程都结束后才会退出。

  • 普通程序:main 线程执行完最后一行,main线程结束 → JVM没有其他非守护线程了 → JVM退出(平时可以写写测试代码)

  • 服务器程序:server.start() 启动了一些后台非守护线程(负责监听端口、处理请求),这些线程会一直运行,等待请求;(启动服务的场景)

所以tomcat,jetty这些都是会通过脚本启功一个非守护线程来保持服务的运行的。

来看看tomcat如何优雅的启动项目吧

复制代码
// Tomcat 的简化版启动代码
public class Bootstrap {
    public static void main(String[] args) {
        // 1. 初始化 Catalina(Tomcat的核心容器)
        Catalina catalina = new Catalina();
        
        // 2. 加载配置文件(server.xml)
        catalina.load();
        
        // 3. 启动!------没错,这里也是start()
        catalina.start();
        
        // 4. 重点来了:这里会调用await()方法
        catalina.await();
        
        // 5. 只有在收到关闭命令后,才会执行到这里
        catalina.stop();
    }
}

为什么要await一下呢?就是为了更优雅

复制代码
server.start();  // 启动后台线程处理请求
server.await();  // ★ main线程在这里等待,不会结束
// 直到收到 shutdown 命令,await() 才会返回
server.stop();   // 然后执行清理工作

不同启动方式的对比

特性 原生 HttpServer Tomcat
main线程状态 直接结束 await() 处阻塞等待
后台线程 存在,处理请求 存在,处理请求
如何停止 只能强制kill进程 可以通过shutdown命令优雅停止
控制台表现 看似"挂起"在那里 看似"挂起"在那里
关闭钩子 难以及时执行清理 可以执行清理(如保存Session)
  1. 更好的控制:main线程保持运行,可以随时响应关闭命令

  2. 优雅关闭:收到关闭命令后,可以等待正在处理的请求完成

  3. 清理资源:有机会保存Session、关闭连接池等

相关推荐
2601_966799049 小时前
酷嗨米J300:一台相机同步推三平台
运维·服务器·负载均衡
AI行业说9 小时前
2026年清洁耗材智能模板机品牌排名:扫地机拖布、美妆粉扑工厂自动化选型指南
运维·自动化
派大鑫wink9 小时前
Dify 工作流搭建操作手册:以信息化运维周报自动生成为例
运维
志栋智能9 小时前
超自动化运维:支持微服务架构的运维模式
运维·架构·自动化
Bamtone20259 小时前
Bamtone班通:TDR阻抗测试仪如何高效助力AI服务器高速信号完整性验证?
服务器·人工智能·阻抗测试·阻抗分析
资深电气设计10 小时前
技术分析:空调机房水泵性能优势与系统适配性研究——水力能效、结构集成与智能运维维度
大数据·运维
Brilliantwxx10 小时前
【Linux】 进程(7)深度剖析 进程内核O(1)调度队列 + 饥饿问题
linux·运维·服务器
疯狂打码的少年10 小时前
【数据库技术】关系完整性约束(实体/参照/用户定义)
运维·服务器·数据库·笔记
小谈不敲代码10 小时前
【12-kubenetes的持久化存储】
运维·kubernetes
梦想的旅途210 小时前
企业微信API如何实现自动化办公
运维·自动化·企业微信