JAVA定时任务多线程占用内存,Java线上定时任务不定期挂掉问题分析

作者:IKNOW本尊

问题背景

收到频繁的告警邮件,定时任务调度失败,查看xxl-job的执行器列表是空的,但是服务又显示健康,查看历史任务执行记录发现执行器是依次递减,由于是线上服务,只能先重启,然后线程日志也没有,同时尝试访问服务的健康检查接口,发现健康检查接口访问不通,应该是服务已经挂了,但是因为服务配置的TCP健康检查,没鲸云没有检测出来服务异常(血淋淋的教训)。

cd05f17daf4648963fa30b2f8e736cf6.png

eb2e9cad30337ed33c2db0c9ab8eb4c3.png

总结问题现象:xxl-job的执行器列表为空,TCP检测正常,服务显示正常,但是http健康检查接口访问不了,服务其实处于挂掉状态。

初步排查过程:

1.查看线上的APM,发现两个异常:

堆内存会定期处于打满的状态 (被打满的都是 Eden Space----校长的定时任务计算任务很大,打满也是正常的,而且看了GC次数,young GC 和 old GC也没有太大异常)-----挂掉的时刻和正常情况的堆内存几乎是相同的规律,dump出现上的内存后,查看也没有什么问题,暂时排除是内存问题导致

发现重启的服务线程池一直在缓慢的增长,不是很理解,正常的线程池不会一直处于增长的状态,而且增长的数量也很大

916c5195b61309be2fb27b9a83b36eda.png

4ec9aa68b7c0ce00ae3189cf7f4e96a7.png

2.进入终端,用arthas查看服务器线程状态

arthas 进入终端,执行thread命令 确实发现很多的线程处于WATING状态,dump出线程堆栈,发现有200多个线程处于WATING状态。

b4b515071475bb82186dd581f5478ce9.png

4b26e6e8b9aa27b3cf889e50c58d1f12.png

3.arthas 查看WATING状态的线程堆栈, 发现所有线程都处于下面的堆栈,看不出什么太多的线索,代码中查看是不是有什么地方设置了无限线程的线程池,发现也没有这么挫的操作。

a9dd5f6e5ad7ddbb5d867103d0290e83.png

4.张师傅注入线程的init方法, 发现是xxl-job的线程

[

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,我们可以使用定时器来实现定时任务。有几种方式可以实现定时任务多线程编程。 引用和引用展示了使用java.util.Timer类来创建定时任务的示例代码。在这个例子中,我们创建了一个定时器对象,并使用schedule方法来安排任务在一定延迟后执行。每个任务都是一个TimerTask对象,可以通过重写run方法来定义任务的具体逻辑。这种方式适用于简单的定时任务。 引用展示了使用java.util.concurrent.ScheduledExecutorService接口来创建定时任务的示例代码。通过调用scheduleAtFixedRate方法,我们可以安排任务以一定的初始延迟后开始执行,并以固定的时间间隔重复执行。这种方式更加灵活,可以满足更复杂的定时任务需求。 无论是使用Timer类还是ScheduledExecutorService接口,都可以在多线程环境下实现定时任务。通过创建线程池,我们可以控制并发执行的任务数量,并提供更好的线程管理和调度。 总之,Java提供了多种方式来实现定时任务多线程编程,开发者可以根据具体需求选择适合的方法来实现定时任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Java多线程案例之任务定时执行器](https://blog.csdn.net/m0_59139260/article/details/124015250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Java多线程示例与定时任务实现](https://blog.csdn.net/WU_coding/article/details/125884950)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值