采用ScheduledThreadPoolExecutor执行定时重试任务时内存溢出的分析及解决.docVIP

采用ScheduledThreadPoolExecutor执行定时重试任务时内存溢出的分析及解决.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
采用ScheduledThreadPoolExecutor执行定时重试任务时内存溢出的分析及解决.doc

采用ScheduledThreadPoolExecutor执行定时重试任务时内存溢出的分析及解决 摘 要:开发JavaWeb项目中发现服务之间的调用存在超时情况,由于涉及的处理逻辑全部是异步,引入定时重试的机制,重试工具选择了JDK自带的ScheduledThreadPoolExecutor。当A服务依赖B服务,B服务由于在业务高峰期处理能力降低,导致大量A服务过来的请求超时,A加入了超时重试机制,间隔时间根据重试次数的多少来决定,次数越多,两次重试之间间隔的时间越多,此时的业务高峰也会给A带来大量请求,大量的超时会导致重试队列迅速堆积,直到内存溢出。该文从线程池工作机制、ScheduledThreadPoolExecutor实例的创建,获取重试任务的过程以及提交任务的过程角度分析,并通过源代码的剖析和测试工具MyEclipse进行演示测试内存泄露的情况,得出避免内存泄露的解决方案。 关键词:ScheduledThreadPoolExecutor 线程池 内存溢出 中图分类号:TP3 文献标识码:A 文章编号:1672-3791(2016)03(a)-0015-03 1 ScheduledThreadPoolExecutor实例的创建过程及线程池工作机制 1.1 ScheduledThreadPoolExecutor实例的创建过程 重试工具选择了JDK自带的ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor实例的创建过程如下:ScheduledThreadPoolExecutor实例的创建过程如下:(1)获取当前机器上处理器的数量;(2)使用Google的ThreadFactoryBuiler创建指定格式名称的线程,以方便查看问题;(3)有需要被拒绝的任务时,抛出异常;(4)创建定时任务池;打开MyEclipse工具显示相对的代码:int corePoolSize Runtime.getRuntime().availableProcessors(); ThreadFactory tf new ThreadFactoryBuilder().setNameFormat(FailureRetryTask-pool-%d).build(); RejectedExecutionHandler handler new ThreadPoolExecutor.AbortPolicy(); ScheduledThreadPoolExecutor taskService new ScheduletThreadPooExecutor(corePoolSize,tf,handler); 线程池就是多个线程在一个队列中取任务执行,提交的任务会被放入队列中等待线程执行,故队列要设置一个大小。线程池同样会根据任务繁忙程度来动态调整连接数,空闲时保持最小连接数,繁忙时增加连接,但不会超过上限,具有伸缩性,线程的创建和销毁也需要消耗系统资源,线程的连接重用就可以避免这部分损失,具有重用性。 1.2 线程池工作机制 线程获取任务的策略就是如果当前线程池运行状态正常,则阻塞等待任务,否则直接返回或等待有限时间后返回。线程池中线程的主要任务就是获取任务,然后执行,然后再去获取任务,如此循环,这就实现了线程池中线程的可重用。 Worker封装了任务,同时创建了新的线程,并被添加到集合workers中,这个workers其实就是最核心的线程池。通过run方法实现重用。private final HashSet workers new HashSet(); public void run() try Runnable task firstTask; firstTask null; while(task! null||(task getTask())! null) runTask(task); task null; finally workerDone(this); Runnable getTask() for(;;) try int state runState; if(state SHUTDOWN) return null; Runnable r; if(state SHUTDOWN) r workQueue.poll(); else if(poolSize corePoolSize||allowCoreThreadTimeOut) r workQueue.poll(keepAliveTime,TimeUnit.NANOSECONDS); else r workQueue.take(); if(r! null) return r; if(workerCanExit()) if(runState SHUTDO

文档评论(0)

yingzhiguo + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:5243141323000000

1亿VIP精品文档

相关文档