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

相关推荐
不愿透露姓名的大鹏2 分钟前
Linux环境下Node.js后台运行方式(实用版)
linux·运维·node.js
白露与泡影2 分钟前
从 BIO 到 epoll:高并发 I/O 模型演进与本质分析
java·服务器·数据库
菜鸟小九9 分钟前
JVM类加载与字节码技术(类文件结构、字节码指令、编译期处理、类加载阶段、类加载器、运行期优化)
jvm
biubiubiu070614 分钟前
Linux 与 Shell 自动化运维基础知识记录
linux·运维·自动化
江不清丶16 分钟前
生产实战:系统频繁Full GC,如何一步步定位与解决?
java·jvm
Riu_Peter18 分钟前
【技术】Docker 释放空间
运维·docker·容器
吃不胖爹21 分钟前
宝塔部署前后端时,配置域名与ssl证书
java·jvm
杨浦老苏23 分钟前
可视化Docker Compose构建器VCompose
运维·docker·开发·可视化·群晖
爱学习的程序媛26 分钟前
【Day2】WSL2+Docker配置全攻略
运维·docker·容器·wls2
KOYUELEC光与电子努力加油29 分钟前
BROADCOM博通集成 Matter 1.5平台认证就绪、BK7239N等芯片助力智能家居无缝融合
服务器·科技·单片机·智能家居