复习-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、关闭连接池等

相关推荐
tedcloud1232 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
2301_769340675 小时前
如何在 Vuetify 中可靠捕获 Chip 关闭事件(包括键盘触发).txt
jvm·数据库·python
AC赳赳老秦6 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
夏日听雨眠6 小时前
LInux(逻辑地址与物理地址的区别,文件描述符,lseek函数)
linux·运维·网络
woniu_buhui_fei7 小时前
JVM编译器
jvm
哲霖软件7 小时前
ERP 赋能非标自动化行业:破解物料与库存管理难题
运维·自动化
m0_596749097 小时前
JavaScript中手动实现一个new操作符的底层逻辑
jvm·数据库·python
火车叼位8 小时前
替代 Tiny Win10 的 Linux 方案:Debian XFCE 精简桌面搭建
linux·运维
dFObBIMmai8 小时前
如何在 CSS 中实现元素的绝对定位,使其不受窗口尺寸变化影响
jvm·数据库·python
大明者省9 小时前
宝塔开了端口,Ubuntu 还得开相应端口才能打通
服务器·数据库·ubuntu