曾宏:监控中误用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))

 

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

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

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

 

其它说明

 

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

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

2、Timer与ScheduledThreadPoolExecutor区别

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

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

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

二、租用AutoDL服务器与连接教程 点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。 阅读详情

相关推荐

隐藏技巧!用ArcGIS Pro像素编辑器实现PS级影像编辑(附地貌伪装案例)

本文深入探讨ArcGIS Pro像素编辑器的创意应用,从基础操作到高级影像处理实战,展示了其在城市规划、环境分析等领域的独特价值。通过详细的功能解析和地貌伪装等案例,帮助用户实现媲美专业图像处理软件的精细操作,提升GIS工作效率。

weixin_28520495的博客 335

我将结合您提供的代码(特别是 InitializeUpdateTimer 和 _ChannelCommonResultProcedrue 方法),详细解释以下内容

为了分析定时器行为(System.Timers.Timer 或 System.Windows.Forms.Timer)和 GC 频率,确保优化后的代码(如 InitializeUpdateTimer)有效运行并防止 OutOfMemoryException,需要定期检查日志并结合内存分析工具。句柄泄漏(Handle Leak)是指程序创建的操作系统句柄(如线程句柄、文件句柄、GDI 对象句柄)未被正确释放,导致这些资源持续占用非托管内存,最终可能耗尽系统资源或进程地址空间。代码未显式跟踪或终止这些线程。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 861

OpenCV视频防抖算法实现与优化指南

本文详细解析了如何使用OpenCV实现视频防抖算法。通过特征点检测与光流跟踪估算帧间运动,利用滑动平均平滑运动轨迹,并应用仿射变换重塑视频帧。文章提供了完整的代码实现、参数调优指南及黑边处理等优化技巧,帮助开发者高效处理手持拍摄等场景下的视频抖动问题。

weixin_29062823的博客 339

linux一个进程实现多个定时器,Linux下的多线程定时器实现

一、功能:Linux下编写一个程序库,实现定时器的功能,它能为用户提供在同一进程中多次使用的定时器。二、实现#include #include #include #include #include #include #include #include #define DEFAULT_INTERVAL 1int TIMER_CNT = 0;class Timer; //...

weixin_33026067的博客 857

Zotero+WPS文献引用跳转功能缺失?3分钟教你用VBA宏搞定(附完整代码)

本文针对WPS用户使用Zotero时文献引用无法点击跳转的痛点,提供了一套完整的VBA宏解决方案。通过解析Zotero的域代码,自动在文内引用和文末参考文献之间创建超链接,实现一键跳转,极大提升了学术写作与文献查阅的效率。

weixin_28419039的博客 671

金融科技创新中人工智能的应用:8篇优质论文精选(含2023)

随着科技的飞速发展,金融领域正经历着前所未有的变革。在这个过程中,人工智能技术发挥着越来越重要的作用。为了深入探讨金融人工智能的研究和应用,享享特地整理了几篇金融人工智能方面的论文,大家可以看一下金融人工智能方向最新的研究成果!面向金融领域的大型语言模型本文介绍了BloombergGPT,一个基于广泛金融数据训练的500亿参数模型。基于彭博(Bloomberg)广泛数据来源,建立了一个基于彭博数据的3630亿令牌数据集,并结合了额外3450亿通用数据令牌。

2401_82426425的博客 3210

[common-sln]: base增加多定时器组件

操作系统现有的API linux的定时器: 1. 基于信号的setitimer系列 ----- 信号是进程域,对于同一种信号,只能有一个处理函数;如果别的模块也扑捉同一种信号,那么后面设置的信号处理会覆盖前面的处理方法。 2. 基于文件描述符的timer_create系列 ----- 稍显复杂;而且会"消耗"文件描述符,这不适合于文件描述符需求大且系统文件描述符不足的情景。 windows的定

二斗墨汁 1046

Transformer实战(5)——Hugging Face环境配置与应用详解

本文详细介绍 Transformer 模型的实践应用全流程。首先讲解基于 Anaconda 的环境配置,包括 transformers 库安装及 hf-mirror 镜像加速方案。然后以 BERT 为例,演示分词器使用、文本编码及 fill-mask 等任务实现,对比 PyTorch/TensorFlow 框架差异。接着展示 Hugging Face 社区模型应用,包括 GPT-2 文本生成和零样本分类。最后扩展至多模态领域,使用 CLIP 模型实现零样本图像分类。

盼小辉丶的博客 1万+

项目创建了几百个线程,你要怎么优化?

前言 当大家打开AndroidStudio的Profiler工具时,是否遇到过这种情况: 哇塞好几百个线程??名字咋都是12345?怎么都在sleep或wait但就不销毁? 其实,当一个项目规模越来越大时,随着开发人员变更、老代码不规范、三方sdk引入越来越多,很难避免线程数量暴涨的问题。当线程过多时,不仅有oom风险,更会带来很多内存泄漏的隐患。但通过Profiler工具也只是知道线程数量,用Thread.getAllStackTraces()方法获取到的也只有线程的运行时堆栈,即到run()方法就结束了

Android 开发架构 731

诊断CAPL自动化(3)——封装了接收诊断数据的通用CAPL脚本函数库

DiagGetRespPrimitiveSize (获取诊断响应的单个数据) diagGetPrimitiveData (获取诊断返回的所有数据) DiagGetRespParameter(数值类型) DiagGetRespParameter(字符串类型) DiagGetRespParameter(byte数组)

蚂蚁小兵 6218

蓝牙调试抓包工具--nRF Connect移动端 使用详细总结

摘要: nRF Connect移动端是一款功能全面的蓝牙低功耗(BLE)调试工具,支持设备扫描、多设备连接、服务/特征值查看及数据读写操作。核心功能包括实时数据通信(读取/写入/通知)、设备固件更新(DFU)以及高级工具如自动化测试和信号分析。兼容Android 4.3+和iOS设备,适用于开发调试(如ESP32/nRF52)、设备管理和数据分析。需注意设备兼容性问题(如旧安卓设备可能需关闭连续扫描),并确保数据类型匹配。配套工具链包括nRF Toolbox和nRF Connect SDK,是BLE开发的必

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2375

用最小堆实现通用的高效定时器组件

对于定时器容器,本篇用到了STL接口的容器,通过重载Timer运算符,实现按照时间戳(mExpired)从小到大排序。将定时器任务抽象处三个类,各自负责自己的业务,逻辑上更加清晰明了。使用一个系统定时器资源,完成所有定时任务的响应。实现基础功能的同时,降低对系统定时资源的消耗。

LinuxTaoist的博客 940

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1149

在java.lang.Timer为非守护线程的情况下,加入到TimerTask的任务执行完毕了,Timer线程仍在继续运行的原因

问题引入: 假设当前时间为2019-03-13 22:10:00 ,定义任务A在3分钟后执行,任务B在5分钟后执行,我们将A和B加入至Timer中,根据Timer中TaskQueue顺序启动任务的原则,8分钟后任务A和任务B都会执行完毕。问题来了,明明任务全部执行完毕了,为什么Timer线程仍在继续 执行,就仿佛停不下来了呢? 首先,我们来看看Timer的构造函数 public Ti...

爱喝咖啡的程序员的博客 1071

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Timer的一些存在的问题

延迟的、具有周期性的任务            Timer只创建唯一的线程来执行所有timer任务。如果一个timer任务的执行很耗时,会导致其他TimerTask的时效准确性出问题。例如一个TimerTask每10ms执行一次,而另一个TimerTask每40ms执行一次,重复出现的任务要么会在耗时的任务完成后快速连续地被调用4次,要么完全“丢失”4次...

新一天 741

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

详解java定时任务

在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。一、简介      在java中一个完整定时任务需要由Timer、TimerTask两个类来配合完成。 API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任

chenssy 的技术博客 8万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

分析 java 占用 cpu 过高的原因以及 java ScheduledThreadPoolExecutor bug 介绍

近期发现一个java进程的cpu占用接近100%。 开始简单地认为是由于给java分配的内存不足,从而导致频繁GC。 于是首先的处理方式就是直接给该java程序分配更多的内存,然而进程启动没几分钟,cpu占用再次接近100%,看来问题没这么简单。   一. 分析 java 占用 cpu 过高的原因 1. 通过top命令直接查到该java进程的进程ID,可以看到进程ID为26260。 ...

Dancen的专栏 3917

高并发编程之ScheduledThreadPoolExecutor讲解

一、ScheduledThreadPoolExecutor介绍 ScheduledThreadPoolExecutor,它可另行安排在给定的延迟后运行命令,或者定期执行命令。需要多个辅助线程时,或者要求 ThreadPoolExecutor 具有额外的灵活性或功能时,此类要优于Timer。 二、ScheduledThreadPoolExecutor相对于Timer的优势 ScheduledThre...

weixin_42146366的博客 2373

线程池之ScheduledThreadPool学习

简介 ScheduledThreadPool是一个能实现定时、周期性任务的线程池。 创建方法 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } 这...

墨玉浮白的博客 1万+

Java ScheduledThreadPoolExecutor 一个优于Timer、TimerTask的定时任务

http://bbs.youkuaiyun.com/topics/380145101 http://olylakers.iteye.com/blog/1218243 http://zhidao.baidu.com/link?url=ZMRiUrVtBUbXLZIc1kgpTms7QrJAn-122-plrZFmoywmzAGHrYkTkgfLqaZZ-x2WQfA86x6bWIA2rn

7135

ant release proguard StackOverflowError

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意! ant java 项目,执行到 proguard 阶段发生 StackOverflowError 错误,错误类似下面: build.xml:339: java.lang.StackOverflowError at proguard.classfile.ProgramClass.constantPoolEntry

智勇软件开发专栏 1117

Timer挂掉的处理方法

Timer运行几个小时后挂掉,虽然我在里面捕捉了所有异常,仍然挂掉了。 查找资料,发现Timer确实有这样的不稳定性。 解决: java.util.concurrent.ScheduledExecutorService globalTimer = java.util.concurrent.Executors.newSingleThreadScheduledExecutor(); ...

godm999的博客 973

Laya1.x Timer小记

Timer是时钟管理类,在Laya初始化的时候会创建一个实例,通过Laya.timer访问。 TimerHandler TimerHandler是对每一个定时任务的封装,每次调用frameOnce、frameLoop、once、loop或者callLayer都会产生一个TimerHandler实例。 TimerHandler会缓存传入的参数(args),当定时器触发时,会将对应的args传递给对...

weixin_34293141的博客 504
上一篇: 更改MYSQL中指定表的默认编码(LINUX)
下一篇: 【外刊IT评论】代码覆盖率:80%,不能少
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值