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

news2024/9/24 15:20:33

目录

踩坑代码

后果展示

原因

小结


概要

上文我们聊了聊阻塞队列,有需要的小伙伴可以去瞅瞅【线程池】换个姿势来看线程池中不一样的阻塞队列(一)_走了一些弯路的博客-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()会是线程阻塞,在某些情况下,会导致内存溢出。

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

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

相关文章

odejs+vue+elementui个人图片电子相册网站_84ds3

系统阐述的是使用智能化电子相册系统的设计与实现&#xff0c;对于nodejs、B/S结构、MySQL进行了较为深入的学习与应用。主要针对系统的设计&#xff0c;描述&#xff0c;实现和分析与测试方面来表明开发的过程。开发中使用了vue.js框架和MySQL数据库技术搭建系统的整体架构。利…

gitcode中删除已有的项目

镜像地址&#xff1a; https://www.jianshu.com/p/504c1418adb7?v1693021320653 扩展阅读 如何在GitLab中删除一个项目 https://www.codenong.com/cs106866762/ 简介&#xff1a; 如何在GitLab中删除一个项目 最近GIT上建了太多项目。想清一下&#xff0c;就在网上查了查…

27台光刻机,ASML做出了选择,无法割舍中国市场

日前ASML公布的业绩显示二季度它对中国市场的光刻机出货量环比猛增两倍多至27台&#xff0c;显示出ASML对中国市场的重视&#xff0c;为何在荷兰决定自9月1日起限制对中国供应先进芯片设备之时&#xff0c;ASML却突然加大了对中国的光刻机供货力度呢&#xff1f; ASML虽然垄断着…

Ruoyi微服务启动流程

1、执行sql 执行sql ry-quarty.sql ry_2023706.sql 到ry-cloud 数据库 2、下载nacos 修改配置文件 修改连接地址 启动nacos 看到下面的配置文件即为成功 修改配置文件里面的数据库连接信息 3、修改nacos 为单机启动 4、启动项目即可 nacos自取 链接: https://pan.baidu…

如何提高企业的维修效率?智能维修设备管理系统有什么作用?

随着工业4.0的不断发展&#xff0c;智能维修设备管理系统已经成为了企业提高维修效率、降低维修成本、优化资源利用的重要工具。本文将介绍智能维修设备管理系统的优势以及推荐使用“的修”平台设备管理系统的理由。 一、智能维修设备管理系统的优势   智能维修设备管理系统通…

PHP8函数的引用和取消-PHP8知识详解

今天分享的是php8函数的引用和取消&#xff0c;不过在PHP官方的参考手册中&#xff0c;已经删除了此类教程。 1、函数的引用 在PHP8中不管是自定义函数还是内置函数&#xff0c;都可以直接简单的通过函数名调佣。函数的引用大致有下面3种&#xff1a; 1.1、如果是PHP的内置函…

暑期习题练习 C语言

编程能力小提升&#xff01; 前言一、转义字符二、重命名与宏定义三、三目运算符四、计算日期到天数转换五、计算字符串长度六、宏定义应用七、const常量八、C语言基础九、const常量&#xff08;二&#xff09;十、符号运算十一、记负均正十二、SWITCH&#xff0c;CASE十三、错…

阿桂天山的技术小结:Flask+UEditor实现图片文件上传富文本编辑

话不多说,有图有源码 先看效果: 1.前端html页面index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><script src"{{ url_for(static,filenameueditor/ueditor.config.js) }}"></script…

pytest执行顺序,不要迷恋pytest-order

所以说pytest的执行顺序是默认编写的顺序来执行的 笔者在编写场景化测试用例时 test_违规告警_未报备空进重出.py 使用了order 序号1-12来进行排序 test_违规告警_未报备重进空出.py 使用了order 序号1-12来进行排序&#xff0c;执行时导致先会执行两个文件夹中order1的用例造成…

C语言练习3(巩固提升)

C语言练习3 选择题 选择题 前言 奋斗是曲折的&#xff0c;“为有牺牲多壮志&#xff0c;敢教日月换新天”&#xff0c;要奋斗就会有牺牲&#xff0c;我们要始终发扬大无畏精神和无私奉献精神。奋斗者是精神最为富足的人&#xff0c;也是最懂得幸福、最享受幸福的人。正如马克思…

2023科隆游戏展开幕~黑神话等多款国产游戏亮相

这是【游戏开发那些事】第62篇原创 科隆游戏展&#xff0c;全名科隆国际游戏娱乐展览会&#xff08;Gamescom&#xff09;&#xff0c;是世界上最大的电子游戏展览之一。由德国联邦协会互动娱乐软件&#xff08;BIU&#xff09;主办&#xff0c;每年在德国科隆举行&#xff0c;…

探讨uniapp的路由与页面栈及参数传递问题

1首先引入页面栈 框架以栈的形式管理当前所有页面&#xff0c; 当发生路由切换的时候&#xff0c;页面栈的表现如下&#xff1a; 页面的路由操作无非&#xff1a;初始化、打开新页面、页面重定向、页面返回、tab切换、重加载。 2页面路由 uni-app 有两种页面路由跳转方式&am…

Activity之间的数据传递方法汇总

在Activity间传递的数据一般比较简单&#xff0c;但是有时候实际开发中也会传一些比较复杂的数据&#xff0c;本节一起来学习更多Activity间数据的传递方法。 1、通过 Intent 传递 我们在进行 Activity 跳转时&#xff0c;是要有 Intent&#xff0c;此时 Intent 是可以携带数…

Ai.Fy - Text To Image——AIGC工具

Ai.Fy 是一个功能强大的 Unity 编辑器扩展,可将文本转换为图像、粗略草图转换为纹理、AI 深度图、概念设计、生成自动法线贴图和平滑贴图。 以下是生成的案例 无需注册,无需API密钥,无需定期付款,无订阅费,无额外费用,无限制,只需单击即可在我们的模型上进行易于使用的…

action和mutation之间的利用 代码解释

场景&#xff1a;购物车点击按钮 context.commit(‘changeCount’, { goodsNum, goodsId })解释这段代码 这段代码是在使用 Vuex 进行状态管理时常见的一种写法。下面对代码进行解释&#xff1a; context.commit 是 Vuex 中的一个方法&#xff0c;用于触发一个名为 changeC…

iconfont 图标在vue里的使用

刚好项目需要使用一个iconfont的图标&#xff0c;所以记录一下这个过程 1、iconfont-阿里巴巴矢量图标库 这个注册一个账号&#xff0c;以便后续使用下载代码时需要 2、寻找自己需要的图标 我主要是找两个图标 &#xff0c;一个加号&#xff0c;一个减号&#xff0c;分别加入到…

Python“牵手”阿里巴巴商品列表数据,关键词搜索阿里巴巴API接口数据,阿里巴巴API接口申请指南

阿里巴巴平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;阿里巴巴API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问阿里巴巴平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而…

【AutoLayout案例05-横竖屏效果 Objective-C语言】

一、接下来,看看这个 我们一看这个效果,就知道需求了吧 需求是,无论在横屏、竖屏下: 1)首先,是不是有四个View啊 无论在横屏、竖屏、下,都有这么四个View吧 这四个View的高和宽,是什么, 相等的吧 这四个View的高和宽,是相等的 那么,既然这四个View的高和宽,是…

Webgis系统调试与发布

Webgis系统调试与发布 调试方法与技巧网站发布方法 调试方法与技巧 在Web开发中&#xff0c;程序调试方法与技巧是开发人员必须掌握的一个重要内容&#xff0c;非常关键。Leaflet开发其实就是HTMLJavaScript的Web开发&#xff0c;其调试方法与一般的Web开发相同。 Web开发调试…

基于JSP+Servlet+Mysql停车场管理系统(含实训报告)

TOC 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的停车场管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&#xff1a;HTML、CSS、JS、JQuery等技术 后端技术&#xff1a;JSP、Servlet、JDBC等技术…