记一次 while(true) 产生的CPU爆满

C#编写大计算量程序总是报内存溢出System.OutOfMemoryException的重要原因 笔者为C#业余爱好者,从开始编写一些计算量较大、内存占用较大的程序时,经常会在编译时报出System.OutOfMemoryException(内存溢出)的错误异常,而实际上,当时的剩余内存还多的是,最终只能改变原有算法,尽量减少内存占用。 我至少经历过以下一些场景的内存溢出提示: 1、使用DataTable或者DataSet,明明没有达到二者的最大行数闲置,却报出了内存溢出异常; 2、使用系统类库,逐行读取一个超大的TXT文件时,读到一定程度报内存溢出; 3、在数组、List中存 阅读详情
  • 背景

最近工作中碰到一个问题
测试系统稳定性的时候发现 CPU 一直爆满
经过多方面排查 发现是多处用了while(true)

  • 处理办法

在while(true) 的代码中加一个 Thread.sleep(1)即可

  • 事后思考

为什么呢 那就得回顾一下操作系统相关的知识
操作系统的 CPU 现在可能有四核、八核、16核 但是我们打开tomcat线程数一看有120多
那么操作系统的 CPU 就要有正确的调度规则 , 操作系统中有很多算法 Unix系统使用的是时间片算法,而Windows则属于抢占式的。

在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进程允许运行的时间。如果在 时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则 CPU 当即进行切换。调度程 序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
所谓抢占式操作系统,就是说如果一个进程得到了 CPU 时间,除非它自己放弃使用 CPU ,否则将完全霸占 CPU 。因此可以看出,在抢 占式操作系统中,操作系统假设所有的进程都是“人品很好”的,会主动退出 CPU 。
在抢占式操作系统中,假设有若干进程,操作系统会根据他们的优先级、饥饿时间(已经多长时间没有使用过 CPU 了),给他们算出一 个总的优先级来。操作系统就会把 CPU 交给总优先级最高的这个进程。当进程执行完毕或者自己主动挂起后,操作系统就会重新计算一 次所有进程的总优先级,然后再挑一个优先级最高的把 CPU 控制权交给他。

回到我们的问题 我们如果写一个while(true) 而不加线程睡眠,那么此线程告诉操作系统的是 我要一直占用资源
如果写一个Thread.sleep(0) ,那么告诉操作系统的是 我可以让出资源给其他人 但是是给优先级比我高的 这样修改有效果 但是不是很明显
如果写一个Thread.sleep(1), 那么告诉操作系统的事 我可以让出资源 并且休息1ms 这样优先级低的也可以持有资源了

那么提出一个疑问 我在 2022-01-19 02:00:00,000 休眠线程 写一个Thrad.sleep(1000) ,那么在一秒后真的会继续执行嘛,答案是否定的一秒后 如果有其他资源还在持有CPU资源 就不会执行。当然这个会很快

所以以后的大循环 甚至 while(true) 建议加一个 Thread.sleep(1) 这样不会一直持有资源

while循环导致的CPU暴涨问题优化实践 经过了上述的代码优化过程,终于解决了处理数据的线程CPU过高的问题,小枫将服务中存在类似循环问题的都进行了修改,经过测试服务对应的CPU使用率有了明显的下降,小枫松了口气,终于可以下班了,想着回家一定给自己加个鸡腿补一补伤掉的脑细胞。故事还会继续,他还会遇到怎样的技术挑战,请大家敬请期待。... 阅读详情

相关推荐

Linux服务器CPU占用过高排查与优化实战指南

CPU性能优化是Linux系统运维的核心技能之一。从计算机体系结构角度看,CPU作为计算资源的核心调度单元,其使用率直接反映系统健康状态。通过top、vmstat等工具可以分析用户态(%us)与内核态(%sy)的CPU时间分布,结合负载均衡(load average)指标判断瓶颈类型。在分布式系统和云原生场景下,合理使用perf、bpftrace等工具进行调用链分析,配合火焰图可视化技术热点,能够快速定位Java应用死循环、锁竞争或内核调度异常等问题。本文基于多年运维经验,系统梳理从快速止血到深度优化的全链

weixin_34326429的博客 340

while(true) Thread.Sleep(XX)我通常是用这种写法,有没有更好的写法或者改进

比如一个TCP通讯里面有一个看门狗来监听连接是否正常我通常是用这种写法,有没有更好的写法或者改进,欢迎讨论。 没什么问题,只要不是死循环或者耗费掉过多内存 看什么场合,写小程序这么写没毛病啊。 我记得有个笑话,说的是一个小白写了一个程序 printf("helloworld") 然后一个老菜鸟看了,说你这个硬编码,不好,应该用一个变量 另一个老菜鸟看了,说要函数复用,应该写一个函数,...

netyou的专栏 4843

Llama3本地部署指南:CPU/GPU均可运行的终端大模型实践

大语言模型(LLM)本地化部署正成为AI工程落地的核心能力,其本质是将云端推理能力迁移至终端设备,实现数据不出域、低延迟响应与离线可用。关键技术支撑包括模型量化(如GGUF格式)、轻量推理引擎(如llama.cpp)及软硬协同优化。Llama3凭借宽松的Llama Community License和多精度量化支持,成为当前最适合本地运行的开源大模型之一;结合Ollama、LM Studio、GPT4All等工具链,可在i5笔记本、ARM工控机乃至树莓派上完成端到端部署。本文聚焦CPUGPU均可运行的实操路

chikuai9995的博客 599

while(true) 循环中使用了sleep休眠了半小时就中断了_线程中断不是你想中断就能的...

为什么不强制停止如何用 interrupt 停止线程sleep 期间能否感受到中断停止线程的方式有几种总结启动线程需要调用 Thread 类的 start() 方法,并在 run() 方法中定义需要执行的任务。启动一个线程非常简单,但如果想要正确停止它就没那么容易了。对于实现线程的几种方式,可见我的上一篇文章实现线程本质上只有一种方式为什么不强制停止对于 Java 而言,最正确的停止线程的方式是使...

weixin_29729247的博客 6383

RT-Thread Studio安装后必做的3件事:设置Workspace路径、管理SDK和创建第一个RTOS工程

本文详细介绍了RT-Thread Studio安装后的关键配置步骤,包括设置Workspace路径、管理SDK和创建第一个RTOS工程。通过优化开发环境设置,帮助开发者快速上手RT-Thread Studio,提升嵌入式开发效率。特别适合刚接触RT-Thread操作系统的开发者参考。

weixin_30660027的博客 370

线程本质与异步真相:从操作系统到.NET运行时的深度解析

线程是操作系统调度的最小执行单元,其创建、调度与销毁直接受内核管理,涉及栈分配、上下文切换和资源回收等底层机制。理解线程并非语法糖(如async/await)的载体,而是承载CPU密集型任务或协调I/O等待的关键资源。真正的异步价值在于释放线程——让其不阻塞等待磁盘、网络或定时器,转而由IOCP、epoll或Timer回调驱动续体执行。这决定了高并发服务的吞吐上限与响应稳定性。本文结合Windows/Linux系统调用、.NET线程池自适应算法及async状态机原理,剖析线程在Web服务、桌面应用与后台任务

baochuanying9531的博客 310

Java Thread.sleep(),结合例子只学一次

这个sleep的方法大家很常见也很常用,也别是刚开始玩代码的时候,很喜欢测试一些逻辑的时候,sleep一下。 sleep 有啥用: 让线程在我们要它执行的时候执行,如果我们不要,那就让它睡,不占用 CPU 资源。 那么其实在使用多线程的时候,很容易关联到 锁的使用 ,synchronized 和 Lock这些 。 那么该篇文章其实核心内容是想让大家知道,sleep 与 锁资源之间的关系。 问题: 使用sleep时, 锁资源会释放吗? 示例介绍,一步一步来: 首先我们写下简单的测试.

默默不代表沉默 7417

ncl泰勒图(均方根误差、标准差、相关系数)

ncl泰勒图(均方根误差、标准差、相关系数)

weixin_61281699的博客 8004

while循环引起cpu爆满问题

while循环引起cpu爆满问题 场景 当我们使用while循环做一些业务时可能会出现死循环 当业务需要用死循环来实现监听的时候或则其他业务 当我们需要一直使用循环业务的时候 问题 产生死循环使程序cpu频率相当高导致卡死 描述 例子:做一个一直数数的业务(开启20个线程数数) 代码 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.uti

ljl52099的博客 1930

共模电感在EMI滤波中的实战应用与设计技巧

本文深入探讨了共模电感在EMI滤波中的关键作用与设计技巧,涵盖电感值选择、饱和电流风险、磁芯材料性能及绕组工艺等实战经验。通过具体案例解析,展示了共模电感在开关电源、高速接口及汽车电子中的高效应用,帮助工程师解决电磁兼容问题并提升信号完整性。

weixin_27051161的博客 416

105. replace( )函数

【目录】

weixin_63986098的博客 1万+

Python中模拟do-while的7种工程实践与避坑指南

在编程中,'先执行后判断'是一种基础控制流模式,广泛应用于用户输入验证、API重试、硬件初始化、文件轮询等场景。其核心原理是打破标准while循环‘先判后执’的约束,确保主体逻辑至少执行一次,从而满足现实系统中对首步不可跳过的语义要求。这种模式虽非Python原生语法,却因EAFP(请求宽恕优于许可)设计哲学而天然契合Python工程实践。它在数据采集、pandas清洗、requests调用、scikit-learn训练等高频任务中展现出显著的技术价值:提升鲁棒性、简化异常处理路径、增强调试可观测性。本文聚

weixin_30319153的博客 410

Tecplot进阶:巧用公式与多Frame对比,实现CFD多工况数据差异的可视化分析

本文详细介绍了如何利用Tecplot进行CFD多工况数据差异的可视化分析,通过公式计算和多Frame对比,实现变量差值自动计算、多视图同步展示和差异量化统计。文章还提供了数据准备、基础操作、实战技巧和常见问题解决方案,帮助工程师高效完成CFD后处理工作。

weixin_29227425的博客 526

PHP 防止 while true循环 CPU 使用率过高的方法

一个简单的事例 比如在用 php、redis做消息对列的时候可以使用,可以根据实际应用场景来做修改 test.php $i = 0; while (true) {     $i++;     if ( $i%30==0 ){         sleep(1);     }     echo $i; } 执行:  php test.php

小黑的博客 5184

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2967

RingBuffer 环形缓冲区----镜像指示位

称作环形缓冲区,也称作环形队列(circular queue),是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。这个宏定义用于计算向下对齐的地址。size和align。size是要对齐的内存大小,align是所需的对齐大小。这个宏返回一个值,该值是size向下对齐到align边界后的地址。例如,假设我们有一个 32 位的系统,并且我们需要将数据对齐到 64 位的边界。我们可以使用在这个例子中,data数组的大小为 10 个元素,我们需要将其对齐到 8 字节边界。宏返回data。

呵呵哒!的博客 2405

java springboot项目 linux生产环境cpu/cpu100%飙升问题排查

第二步:ps H -eo pid,tid,%cpu |grep 5970 查看进程对应的线程。这里的cn.waycube.property实现类对应433行就是代码出问题的地方。2: ps H -eo pid,tid,%cpu |grep 进程id。第三步:printf ‘0x%x\n’ 20507 获取十六进制线程。参考 https://v.douyin.com/iL4gS6Xm/4:jstack 进程id|grep 16进制线程id -A 20。3:printf ‘0x%x\n’ 线程id。

qq_43145676的博客 1729

立体仓库WCS控制系统-AGV通信代码

string str = "任务下发,WCS->NT8000(q-Message),ikey:" + p.ikey.ToString() + "fromStation:" + p.fromStation.ToString() + "toStation:" + p.toStation.ToString();if (nt8000.Connect(_ServerAddr, _ServerPort)) QueueSpeech.AddQueue(string.Format("与NT8000重连成功"));

xdpcxq的专栏 2201

RTSP流媒体服务器(如EasyNVR/MediaMTX)连接数爆满?教你三招低成本优化方案

本文针对RTSP流媒体服务器连接数爆满问题,提供了三招低成本优化方案。通过软件调优、架构优化和硬件资源精打细算,有效提升服务器并发处理能力,解决视频流播放失败问题,适用于中小企业安防监控等场景。

dgjm4087的博客 480

SAP FICO 中的 F-02 :概念、使用场景及案例解析

在 SAP FICO (财务会计与管理会计) 模块中,F-02 是一个用于录入总账凭证的事务代码。这个事务代码主要用于手动输入总账凭证,适用于各类财务交易,例如资产购入、费用支付、收入确认等。F-02 的重要性在于,它允许财务人员在 SAP 系统中创建凭证,并确保这些凭证能够正确影响总账账户。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2060

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python multiprocessing实战:CPU密集任务并行优化全指南

Python的multiprocessing模块是突破CPython全局解释器锁(GIL)限制、实现真正CPU并行的核心机制。其底层原理依赖进程隔离内存空间与跨进程通信(IPC),通过fork/spawn启动方式适配不同操作系统,规避线程共享内存失效问题。技术价值在于将计算密集型任务(如图像处理、数值计算)从单核串行解放至多物理核心并行执行,显著提升吞吐量。典型应用场景包括工业视觉检测、批量数据预处理、模型推理加速等。本文聚焦CPU-bound任务识别、共享内存优化、进程池调优及生产级容错设计,深度融合me

weixin_33889245的博客 544

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ArrayBlockingQueue 自己坑了CPU搞出100%

写监控给自己挖了个坑哈哈,入队列肯定是不阻塞的,不入成功 出队列写了个while poll

luyee2010的专栏 840

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RTSP流媒体服务器(如EasyNVR、ZLMediaKit)连接数爆满?三步排查法+低成本优化方案

本文详细解析了RTSP流媒体服务器连接数爆满的常见问题,提供了三步排查法和低成本优化方案。从硬件资源检查到软件配置调优,再到客户端连接分析,帮助运维人员快速解决视频流播放失败问题,提升服务器并发处理能力。特别针对EasyNVR、ZLMediaKit等主流服务器给出了具体优化建议。

dgjm4087的博客 412

零依赖本地聊天机器人:CPU跑Qwen2-0.5B实现离线对话

本地化大模型推理是指在用户设备端完成语言模型的加载与生成,无需联网、不调用远程API、不依赖GPU。其核心原理是通过4-bit量化(如GGUF格式)压缩模型体积,结合CPU内存映射(mmap)与轻量推理引擎(如llama.cpp),在低资源环境下实现确定性低延迟响应。该技术显著提升隐私保护能力与离线可用性,适用于老年数字扫盲、教育场景、家庭AI助手等对成本敏感、网络不可靠或数据敏感的落地需求。本文基于Qwen2-0.5B与纯Python+tkinter方案,完整呈现一个可双击运行、支持中文流式对话、三轮上下

cuanjingyue4687的博客 414

线上Java服务凌晨3点告警,我靠这张排查流程图5分钟解决了故障

做Java后端开发的同学,大概率都经历过凌晨线上告警轰炸的绝望:手机钉钉、短信、电话轮番震动,睡眼惺忪打开监控面板,映入眼帘的是一片红通通的告警色块、飙升的CPU、堆积的线程、超时的接口。

小筱在线博客 468
上一篇: Gradle|Maven多模块开发解决循环依赖
下一篇: MacOS idea打不开解决方法
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值