热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

executorservice_从ExecutorService的内存溢出谈谈线程池

篇首语:本文由编程笔记#小编为大家整理,主要介绍了从ExecutorService的内存溢出谈谈线程池相关的知识,希望对你有一定的参考价值。 之前写的一个Sq

篇首语:本文由编程笔记#小编为大家整理,主要介绍了从ExecutorService的内存溢出谈谈线程池相关的知识,希望对你有一定的参考价值。


  之前写的一个Sql转发应用出现了内存溢出问题,经过排查发现是ExecutorService没有正确的进行关闭。

  正常来说如果我们将ExecutorService设计成一个静态变量,那么通常我们是不用去管理其是否关闭的,我们只需要对其本身的线程进行维护操作,ExecutorService对象不用我们显示的进行维护操作。但是维护静态线程池对象的不足之处在于,不好去界定池量级的大小,如果太小会导致线程过多的时候线程运行得不到保证,如果过大则通常线程执行时是对内存的一种浪费。所以在调用频率不高的时候,我们往往会在一次调用的时候创建一个ExecutorService,用这个来进行线程池的管理,那么这里就出现了我们遇到的问题,那就是这个ExecutorService其实是需要手动进行关闭的。

 技术图片

 

   上图中ExecutorService就没有正确的关闭。

  为什么ExecutorService不会自己进行回收呢,我们通过对其API的阅读可以得到答案,若是想要ExecutorService完全关闭需要同时满足三个条件:

  1.线程池中没有正在执行的task任务

  2.线程池中没有等待执行的task任务

  3.无法再提交任务到ExecutorService

  显然,如果我们不进行手动关闭的话,第三个条件将无法满足,导致无法其内存无法被回收,而下一次的调用又继续进行了线程池的创建,这样内存迅速的上升,最后导致了OOM。

  那么知道了问题的原因,解决方法其实就比较简单了,我们在使用完之后再调用一个shutdown或者shutdownNow,让线程池状态变成不再能接受线程任务就行了。

  但是这个时候就有了新的问题,如果某个线程阻塞,一直无法关闭,shutdown方法也不能完成自己的使命,但是如果使用shutdownNow方法的话,就会出现关闭的时候还有线程任务没有完成。这个时候要怎么合理的进行线程任务的关闭呢。

  这个时候我们可以设定一个最大超时时间,如果执行shutdown之后经过超时时间还有任务没有结束,那我们就用shutdownNow方法来帮他们上路。

技术图片

 

 

  


推荐阅读
  • 本文介绍了如何利用 Spring Boot 和 Groovy 构建一个灵活且可扩展的动态计算引擎,以满足钱包应用中类似余额宝功能的推广需求。我们将探讨不同的设计方案,并最终选择最适合的技术栈来实现这一目标。 ... [详细]
  • 本文详细介绍了 iBatis.NET 中的 Iterate 元素,它用于遍历集合并重复生成每个项目的主体内容。通过该元素,可以实现类似于 foreach 的功能,尽管 iBatis.NET 并未直接提供 foreach 标签。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • Struts与Spring框架的集成指南
    本文详细介绍了如何将Struts和Spring两个流行的Java Web开发框架进行整合,涵盖从环境配置到代码实现的具体步骤。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 异常要理解Java异常处理是如何工作的,需要掌握一下三种异常类型:检查性异常:最具代表性的检查性异常是用户错误或问题引起的异常ÿ ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 本文深入探讨了SQL数据库中常见的面试问题,包括如何获取自增字段的当前值、防止SQL注入的方法、游标的作用与使用、索引的形式及其优缺点,以及事务和存储过程的概念。通过详细的解答和示例,帮助读者更好地理解和应对这些技术问题。 ... [详细]
  • 解决TensorFlow CPU版本安装中的依赖问题
    本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
author-avatar
萌新求学
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有