面试记录 2026-10-11
题目:Spring中shutdownhook作用是什么?
难度:low
标签:spring/practice, difficulty/low
评分:⭐⭐⭐☆☆(3/5)
我的回答
这个东西具体我没用过,但是从它名字字面理解,应该是在停机时进行的后续处理。在停机的前处理哪些事情,应该是和优雅停机相关的,可以在其中释放资源,做通知、告警之类的操作。
点评
优点:
- 诚实承认没直接用过,不装懂
- 核心理解正确:shutdownhook 是在停机时执行的处理
- 用途理解正确:释放资源、通知、告警
不足:
- 漏掉了具体的 Spring 实现方式(如何注册、@PreDestroy 等)
- 漏掉了 JVM shutdownhook 和 Spring shutdownhook 的区别
- 漏掉了 Spring 容器关闭时的生命周期回调(DisposableBean、@PreDestroy)
补充:
- JVM shutdownhook:通过 Runtime.getRuntime().addShutdownHook() 注册,JVM 关闭时执行
- Spring shutdownhook:通过 Spring 容器关闭时的生命周期回调实现(@PreDestroy、DisposableBean)
- Spring Boot 2.x 默认开启优雅停机(server.shutdown=graceful)
完整讲解
第一部分:知识重点剖析
核心考点定位:考察 JVM 和 Spring 容器关闭时的生命周期管理,理解 shutdownhook 的用途和实现方式。
知识点拆解:
- JVM shutdownhook:
- 通过
Runtime.getRuntime().addShutdownHook(new Thread(...)) 注册
- JVM 关闭时(正常退出或 System.exit())执行
- 典型用途:释放资源、关闭连接、清理临时文件
- Spring shutdownhook:
- 通过 Spring 容器关闭时的生命周期回调实现
- 方式 1:实现
DisposableBean 接口,重写 destroy() 方法
- 方式 2:标注
@PreDestroy 注解(JSR-250 规范)
- 方式 3:在
application.yml 配置自定义 shutdown 方法
- Spring Boot 优雅停机:
- Spring Boot 2.3+ 支持优雅停机
- 配置
server.shutdown=graceful 开启
- 配置
spring.lifecycle.timeout-per-shutdown-phase=30s 设置超时时间
- 关闭顺序:
- Spring 容器关闭 → 调用所有 Bean 的 destroy 方法 → JVM shutdownhook 执行
- Spring 容器关闭时,会触发所有注册了 shutdownhook 的 Bean 的销毁回调
第二部分:考察方向与延伸递进
考察方向:
- 深度:理解 JVM shutdownhook 和 Spring shutdownhook 的区别
- 广度:关联 Spring 容器生命周期、Bean 生命周期、优雅停机
- 应用:能在服务停机时正确释放资源、清理数据
延伸递进面试题:
- JVM shutdownhook 和 Spring 的 @PreDestroy 有什么区别?
- 解答要点:JVM shutdownhook 是 JVM 级别,Spring @PreDestroy 是 Spring 容器级别;执行顺序不同
- Spring Boot 优雅停机怎么配置?工作原理是什么?
- 解答要点:
server.shutdown=graceful 开启,Spring 会等待所有请求处理完成后再关闭
- shutdownhook 执行超时了怎么办?
- 解答要点:JVM shutdownhook 默认无超时,可以通过
spring.lifecycle.timeout-per-shutdown-phase 设置超时
第三部分:面试者参考回答(三步法口语化,300-400 字)
【一句话结论】
面试官您好,shutdownhook 是 JVM 或 Spring 容器关闭时的回调机制,用于释放资源、清理数据。
【三点展开】
第一,JVM shutdownhook 通过 Runtime.getRuntime().addShutdownHook() 注册,JVM 关闭时执行,典型用途是释放资源、关闭连接。
第二,Spring shutdownhook 通过容器关闭时的生命周期回调实现,方式有实现 DisposableBean 接口、标注 @PreDestroy 注解、或配置自定义 shutdown 方法。Spring 容器关闭时会触发所有 Bean 的销毁回调。
第三,Spring Boot 2.3+ 支持优雅停机,配置 server.shutdown=graceful 开启,可以等待所有请求处理完成后再关闭,配合超时时间设置(如 30 秒)。
【一句边界】
当然,shutdownhook 只解决"资源清理"问题,如果资源释放耗时超过超时时间,会强制关闭,需要配合监控告警和合理的超时设置。