【线程池】线程池拒绝策略还有这个大坑(二)

目录

踩坑代码

后果展示

原因

小结


概要

上文我们聊了聊阻塞队列,有需要的小伙伴可以去瞅瞅【线程池】换个姿势来看线程池中不一样的阻塞队列(一)_走了一些弯路的博客-CSDN博客

这波我们一起来研究下线程池的拒绝策略。

你肯定要说了,拒绝策略不就这四个吗,没有技术含量,有啥好聊的

一般要不然是默认的拒绝策略,要不然就是不重要的流程发个告警,连异常都懒得抛,这里得画个重点

欸,说到连异常都懒得抛,那我就不得不来说一说曾经在拒绝策略上踩的坑了。


踩坑代码

如下代码展示

 堆内存大小配置为10m

 代码前期正常输出如下,实现的拒绝策略正常打印了语句,线程池在一个一个的消费任务。

后果展示

      然鹅,在持续输出半个多小时之后,程序员们人人色变,但面试又侃侃而谈的OOM理所应当的出现了,在我的世界里,带给我惊喜

        没办法,按照中国宝宝的体制,长达半个多小时,搁谁也受不了,更何况堆内存只设置了10m。

        那么是谁有问题呢,我们该怎么揪出造成OOM的内鬼呢,毕竟出了这么大的事情总得有人来背锅吧。

        虽说本文的主体是在聊拒绝策略的问题,但总不能不查个清楚,就直接定罪逮捕刚刚写的拒绝策略吧,总得有个狡辩的过程~

        华生,走,去看看犯罪现场吧。


排查过程

      重启刚刚的那段代码, 打开JDK自带的jvisualvm

       

          连接上本地正在运行的代码后,观察十多分钟之后,可以看到右上方堆内存的火焰图以及下方老年代的大小。

         惊不惊喜,熟不熟悉,看看这节节攀升的堆内存,看看这努力的垃圾回收器,GC的这么频繁,但是堆内存仍然在不断增长,在到达大约8M之后,停滞不对,OOM

        


        

         我们dump下当前的堆内存,很快就可以找到占比较大的可疑内存对象 ---》FutureTask

        

        再看下应用也产生了很多的线程。基本上都阻塞在,下面的这行代码

String s = result.get();

        让我们来一起狠狠的撕开

FutureTask.get()

        方法的神秘面纱,为什么会阻塞在这里。

原因

   首先我们很容易可以确定,以上大量线程阻塞的地方是执行拒绝策略的线程。

   让我们直接定位到FutureTask线程阻塞的代码 #get()方法,很明显这里的state不正常,导致了线程阻塞在这里。         为什么state会不正常呢,继续跟进去看#awaitDone()方法,线程在这里阻塞住了,等待唤醒。

         我们在这里插入一个知识点,可以下篇文章来聊聊线程池的异常是怎么处理的,这里就不展开说了,抛个结论先。

        在使用线程池时,如果子线程捕获了异常,该异常不会被封装到 Future 里面。是通过 FutureTask 的 run 方法里面的 setException set 方法实现的。在这两个方法里面完成了 FutureTask 里面的 outcome 变量的设置,同时完成了从 NEW 到 NORMAL 或者 EXCEPTIONAL 状态的流转。

        线程的状态流转只有以下几种,也不会整出别的花活。

  • * NEW -> COMPLETING -> NORMAL
    * NEW -> COMPLETING -> EXCEPTIONAL
    * NEW -> CANCELLED
    * NEW -> INTERRUPTING -> INTERRUPTED

        按照正常理解,这个地方的执行了拒绝的策略的线程状态应该是EXCEPTIONAL

        但实际上,以上线程阻塞的地方,state <  COMPLETING,只能是NEW

        那么问题变成了为什么执行了测试代码中拒绝策略的线程状态会是NEW

        之后的状态EXCEPTIONAL去哪儿了呢

        朋友们,来回顾下我们刚刚插入的知识点,FutureTask的run方法呀

 

         

那么执行拒绝策略的线程,还会继续run吗?当然不会啦。

        所以Future.get()就像苦苦等一个不回头的人,除了浪费时间、浪费资源,没有任何意义,还会造成严重的后果(OOM)。


解决方案

        1.对于线程池的拒绝策略不要静默处理,也就是我demo代码中,只打印了一行日志,什么也不做,哪怕抛个业务异常呢

        2.能用execute()提交任务就使用execute(),除非线程池有返回值才用submit()。

        另外JDK的issue中也有类似的讨论,关于线程池的静默处理的拒绝策略是不是个BUG,有兴趣的同学也可以去看下

[JDK-8286463] DiscardPolicy may block invokeAll forever - Java Bug System


小结

        无论是线程池自带的静默处理的拒绝策略DiscardPolicy,还是我们花里胡哨实现了个类似静默处理的拒绝策略,既不抛出异常也不放回队列的,使用Future.get()会是线程阻塞,在某些情况下,会导致内存溢出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS微课1000例】0071:普通最小二乘法 (OLS)回归分析案例

严重声明:本文来自专栏《ArcGIS微课1000例:从点滴到精通》,为CSDN博客专家刘一哥GIS原创,原文及专栏地址为:(https://blog.csdn.net/lucky51222/category_11121281.html),谢绝转载或爬取!!! 文章目录 一、空间自回归模型二、ArcGIS普通最小二乘法回归(OLS)一、空间自…

拒绝摆烂!C语言练习打卡第六天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)

一、spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。另外说明spring cloud是基…

node_modules.cache是什么东西

一开始没明白这是啥玩意&#xff0c;还以为是npm的属性&#xff0c;网上也没说过具体的来源出处 .cache文件的产生是由webpack4的插件cache-loader生成的&#xff0c;node_modules里下载了cache-loader插件&#xff0c;很多朋友都是vuecli工具生成的项目&#xff0c;内置了这部…

全流程R语言Meta分析核心技术

​Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面…

掌握Six Sigma:逐步解锁业务流程优化的秘密之匙

一、Six Sigma方法简介 1. Six Sigma的起源和概念 Six Sigma起源于1980年代的摩托罗拉公司。当时的摩托罗拉在面临激烈的全球竞争和持续的质量问题时&#xff0c;发明了这种系统的管理方法&#xff0c;并通过实施&#xff0c;获得了显著的成绩。 所谓的“Six Sigma”&#x…

AIGC人工智能涉及三十六职业,看看有没有你的职业(一)

文章目录 一只弹吉他的熊猫 神奇的企鹅 功夫熊猫 视觉光影下的女子 闪光灯效 局部柔光 生物光 LOGO设计 制作儿童绘本故事 换脸艺术 打造专属动漫头像 包装设计之美 建筑设计 如何转高清图 生成3D质感图标 生成微信表情包 探索美食摄影的奇妙之旅 蛋糕创意设…

​LeetCode解法汇总2236. 判断根结点是否等于子结点之和

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个 …

用Python写一个武侠游戏

前言 在本教程中&#xff0c;我们将使用Python写一个武侠类的游戏&#xff0c;大的框架全部搭好了&#xff0c;很多元素都可以自己添加&#xff0c;让游戏更丰富 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 -…

类与对象(下)

类与对象&#xff08;下&#xff09; 一、初始化列表1、构造函数与初始化2、使用初始化列表的形式3、注意点4、代码5、类需初始化列表但没使用初始化列表时报的错误6、成员变量的初始化顺序&#xff08;1&#xff09;顺序&#xff08;2&#xff09;测试代码&#xff08;3&#…

k8s之nodes

概念&#xff1a; Node是Kubernetes中的工作节点&#xff0c;最开始被称为minion。一个Node可以是VM或物理机。每个Node&#xff08;节点&#xff09;具有运行pod的一些必要服务&#xff0c;并由Master组件进行管理&#xff0c;Node节点上的服务包括Docker、kubelet和kube-pro…

5G LAN标准及现状

欢迎关注微信公众号“我想我思”。 随着通信技术的发展&#xff0c;各行各业对网络的可靠性、确定性等提出了更高的需求。5G LAN作为3GPP R16标准定义的关键特性之一&#xff0c;具有组建灵活、直接互通等特性&#xff0c;在网络部署、网络确定性、uRLLC 等方面表现优异&#…

【计算机网络】HTTPs 传输流程

HTTPS和HTTP的区别 1、HTTP协议传输的数据都是未加密的&#xff0c;是明文的&#xff0c;使用HTTP协议传输隐私信息非常不安 HTTPS协议是由SSLHTTP协议构建的可进行加密传输、身份认证的网络协议&#xff0c;要比http协议安全。 2、HTTPS协议需要到CA申请证书&#xff0c;一般…

06-Numpy基础-线性代数

线性代数&#xff08;如矩阵乘法、矩阵分解、行列式以及其他方阵数学等&#xff09;是任何数组库的重要组成部分。 NumPy提供了一个用于矩阵乘法的dot函数&#xff08;既是一个数组方法也是numpy命名空间中的一个函数&#xff09; x.dot(y)等价于np.dot(x, y) 符&#xff08;…

MySQL每日一练--校园教务系统

一丶数据库名称&#xff1a;SchoolDB 二丶数据库表信息&#xff1a;角色信息表 表名&#xff1a; t_role 主键&#xff1a; r_id 序号 字段名称 字段说明 类别 位数 属性 备注 1 r_id 角色编号 int 主键 自动增长 2 r_name_EN 角色名&#xff08;英…

C++信息学奥赛1149:最长单词2

#include <iostream> #include <string> using namespace std; int main() {string str1;// 输入一行字符串getline(cin,str1);int n0;string MaxArr"";string MinArrstr1;string arr"";for(int i0;i<str1.length();i){if(str1[i] or str1…

4G模组EC20 网卡udhcpc获取IP但是没有设置IP

使能网卡&#xff1a; ifconfig usb0 up dhcp获取ip&#xff0c;虽然没有报error&#xff0c;但是很显然没有设置进配置 获取ip命令&#xff1a;udhcpc -i usb0 非正常现象&#xff1a; 正常现象&#xff1a; 解决方法&#xff1a; &#xff08;1&#xff09;rootfs 创建文件夹…

深入浅出AXI4协议(1)——概述

写在前面 从这篇文章开始&#xff0c;我们将正式进入AXI4协议的学习&#xff0c;在xilinx系列的FPGA中&#xff0c;AXI4协议的使用是非常广泛的&#xff0c;很多的IP核都会支持AXI接口&#xff0c;而如果使用的是zynq系列&#xff0c;那AXI协议的学习更是重中之重。但是作为一款…

leetcode1475. 商品折扣后的最终价格 【单调栈】

简单题 第一次错误做法 class Solution { public:vector<int> finalPrices(vector<int>& prices) {int n prices.size();stack<int> st;unordered_map<int, int> mp;int i 0;while(i ! prices.size()) {int t prices[i];if (st.empty() || t …

机器学习笔记 - 使用 AugMix 增强图像分类模型的鲁棒性

一、简述 图像分类模型能够预测与训练数据具有相同分布的数据。然而,在现实场景中,输入数据可能会发生变化。例如,当使用不同的相机进行推理时,照明条件、对比度、颜色失真等可能与训练集不同,并显着影响模型的性能。为了应对这一挑战,Hendrycks 等人提出了 AugMix 算法。…