`
56553655
  • 浏览: 202899 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

曾宏:监控中误用Timer导致进程无限增多的问题

阅读更多

案例详情

 

后台任务引入系统监控,所有客户端配置、代码修改、服务器端配置都做好后,启动任务,任务可以正常处理数据,监控视图也是正确的。

 

但是当任务结束退出后,发现进程依然被占用。执行多少次任务,就多了多少个进程。尤其在定时任务中问题尤为明显。

 

错误分析

 

实际上这是系统监控的一个bug

 

comsat对非web应用的监控要求在main函数里加上如下代码段,使用编程方式启动collector线程:

Launcher launcher = new Launcher();

launcher.startup();

 

launcher.startup()使用到了Timer实现定时操作(定时将监控数据发送到服务器端):

private static final Timer timer = new Timer();

timer.scheduleAtFixedRate(proxy, firstTime, period);

即使任务已经跑完,进程依然不会终止,因为Timer线程不是守护线程,在main函数执行完后它依然会继续调度执行。

 

正确用法

 

方法1

修改 private static final Timer timer = new Timer();

为   private static final Timer timer = new Timer(true);

设置Timer线程为守护线程。

 

方法2

使用ScheduledThreadPoolExecutor代替Timer

ScheduledThreadPoolExecutor executor

= new ScheduledThreadPoolExecutor(corePoolSize,new DaemonThreadFactory(true))

 

以上两种方法都是将定时操作设置为守护线程。

推荐使用方法2jdk1.5后,scheduledThreadPoolExecutor作为定时任务的调度器,完全可以代替问题多多的Timer

平台后续会发布comsat新版本,使用方法2解决这个bug(所以目前任务最好暂不引入comsat监控)。

 

其它说明

 

1daemon线程与 non-daemon线程的区别:

daemon线程,就是一种“在背景提供通用性服务”的线程,它并不属于程序本体。因此,当所有non-daemon线程结束生命,程序也就终止了。如果有任何non-daemon线程还在执行,程序(也就是main()的那个线程)就不能终止。

2TimerScheduledThreadPoolExecutor区别

1Timer对调度的支持是基于绝对时间的,因此任务对系统时间的改变是敏感的;而ScheduledThreadPoolExecutor支持相对时间。

2Timer使用单线程方式来执行所有的TimerTask,如果某个TimerTask很耗时则会影响到其他TimerTask的执行;而ScheduledThreadPoolExecutor则可以构造一个固定大小的线程池来执行任务。

3Timer不会捕获由TimerTask抛出的未检查异常,故当有异常抛出时,Timer会终止,导致未执行完的TimerTask不再执行,新的TimerTask也不能被调度;ScheduledThreadPoolExecutor对这个问题进行了妥善的处理,不会影响其他任务的执行。

2
0
分享到:
评论

相关推荐

    大学文化艺术节电子竞技社团活动策划书.docx

    电子竞技社团活动策划书是大学文化艺术节中一个重要的组成部分,旨在组织一场有序、安全且吸引人的电子竞技比赛。以下是对该活动策划书中涉及的关键知识点的详细说明: 1. **人员安排**: - **总策划**:张云枫,...

    乡镇道路交通安全工作总结.docx

    - **方针原则**:“安全第一,预防为主”的方针被明确指出,体现了工作中的核心理念。 - **总体要求**:实行“政府领导,部门协作,联动,齐抓共管,综合治理”的总体要求,强调了多方面合作的重要性。 - **工作目标...

    家乡的小河-生活因你而美作文.doc

    这篇文档实际上是一篇以家乡小河为主题的作文,虽然标签...综上所述,这篇作文不仅描绘了作者对家乡的深情,还传递了环保意识、可持续发展的重要性以及地方文化保护的必要性,这些都是我们现代社会中不可或缺的知识点。

    项目部各科室与各人员职责汇编.doc

    在项目管理中,组织架构和职责明确是确保工程高效运作的关键。以中铁建设集团第三十五项目经理部为例,项目组织通常包括项目经理、项目总工程师、工程经理、成本经理等多个部门,每个角色都有其特定的职责。 1. **...

    zenghongcong:个人大师

    曾宏聪个人主页构建设置# install dependenciesnpm install# serve with hot reload at localhost:8080npm run dev# build for production with minificationnpm run build# build for production and view the ...

Global site tag (gtag.js) - Google Analytics