51Testing软件测试论坛

标题: CPU占用率问题! [打印本页]

作者: 超越自我    时间: 2008-12-1 08:47
标题: CPU占用率问题!
JAVA进程占用CPU:100%,

有什么方法可解决?或者什么原因造成?

作者: 超越自我    时间: 2008-12-1 09:44
转自网络上的对话参考中)

我现在有一个程序,其中有四个线程需同时开启,每个线程都占有CPU的25%,运行很稳定,经过多次修改,只是降低了内存.
CPU的占用率具体和什么有关呢?有人指点说要改变结构,说的太过笼统.请给点具体些的指点!
网友回复: 那不是好事情么?总占用率达到了百分百啊!运行稳定就OK啦,这样的利用率分配估计是因为没有其他重要的进程在运行。CPU的占用率是指单位时间内一个进程占用CPU时间片的数量比率。
有时候你看PC机上的进程治理器,会发现有些进程的占用率是0,那是因为CPU没有分时间片给这些进程。
而你的程序里,四个线程,各占25%,估计是你的系统的CPU的进程(线程)治理模块的机制决定的(往往是由进程或者线程的优先级决定),你要改,就要改系统的治理机制了。

这是我的见解,楼下如有更好见解或者觉得我讲的有问题,请批评指出,谢谢。
网友回复:CPU的占用率达到100%后,就会显得反应就有些慢.
当CPU的占用率降低,机器反应就会快.

网友回复:运行什么程序啊?
要占100%内存?
网友回复:引用 2 楼 shuwenling 的回复:
CPU的占用率达到100%后,就会显得反应就有些慢.
当CPU的占用率降低,机器反应就会快.

所以就有可能是你的进程调用了系统的什么东西,所以优先级高了,四个线程就一直占用着CPU啊,所以其他进程就很难得到CPU,所以机器就慢。
网友回复:1.是占用CPU为100%,不是内存占用100%.
2.我想知道如何将进程所占用的25%降到18%左右

网友回复:我知道是CPU为100%,CPU的调度算法估计我们也改不了,所谓我上面不是说了么“所以就有可能是你的进程调用了系统的什么东西,所以优先级高了,四个线程就一直占用着CPU啊,所以其他进程就很难得到CPU,所以机器就慢。”
假如算法复杂了,自然CPU要计算的时间就长了(CPU只是起计算作用)。就算你优化了算法,使得内存的使用降低了,CPU在一点范围内的使用率还是无法降低的。
当然我讲的都是一己之词。等待高手进来解决。
网友回复:调用了系统的东西?优先级高了?
呵呵,我没有调用系统中的东西,只是进行了较复杂的计算,repaint在重复的调用,这样会一直占用CPU吗?
网友回复:帮帮忙
网友回复:帮不上忙,不过你可以到Google上搜下吧!
网友回复:要害是别阻塞~~~
cpu闲着也是闲着,100%没啥不好的
网友回复:有必要开这么多线程吗?
网友回复:引用 6 楼 PQjava 的回复:
我知道是CPU为100%,CPU的调度算法估计我们也改不了,所谓我上面不是说了么“所以就有可能是你的进程调用了系统的什么东西,所以优先级高了,四个线程就一直占用着CPU啊,所以其他进程就很难得到CPU,所以机器就慢。”
假如算法复杂了,自然CPU要计算的时间就长了(CPU只是起计算作用)。就算你优化了算法,使得内存的使用降低了,CPU在一点范围内的使用率还是无法降低的。
当然我讲的都是一己之词。等待高手进来解决。

网友回复:相比较内存占用率,我觉得CPU占用率高本身并不是大问题.
占用率100%,说明在这个时间点,你的程序使用了CPU的所有资源.
问题在于,你的程序不能一直占用100%的CPU.假如是这样,你需要去看看是不是有死循环之类的.
假如确实有需要有一个线程不间断的做一件事情,(一般是监控),可以考虑使用守护线程或者考虑采在循环间加一些Sleep.

我个人还没有经历过除死循环外的CPU一直占用100%的情况~
网友回复:路过帮顶
网友回复:经过这几天的修改,现在CPU在99%处有所波动,但是还没有降下来.
在程序中确实需要一个线程不能间断进行监控,循环间已经加了Sleep.
我是在调试过程中开的四个线程,当然线程的个数是可以改变的.

网友回复:谢谢大家,我还在修整代码,请大家多多指点
网友回复:死循环必须得加sleep,把CPU让出来调度一下别的任务。
查看一下是否有死锁,或是同步处理有多锁的问题。
最好能用调试工具,看一下,占用CPU比较高时,程序在做些什么,或是打印日志分析一下也行。
网友回复:日志里没能看到有反映出什么,而且有很多乱字符,我也进行了一步一步的调试,结果只是运算较复杂,没看出别的
网友回复:CPU的占用率只是和逻辑,线程有关吗?这个我还不是很了解.
不过经过这几天的整理代码,我发现其它的修改对于CPU的占用率没有什么影响.
网友回复:谈一下我的理解:
首先,手机的CPU要做什么是要由手机应用程序治理器控制的,就是说我们的程序不可能达到100%的占用,在运行MIDLET的时候还要运行系统的程序;
其次,线程是靠分配时间片执行的,执行了这个,就要执行下一个,所以需要合理设计多线程的运行。比方说减小每个线程的任务量(代码短小精悍),这样尽量使CPU能在该时间片内提前完成任务,剩下的时间它不就可以“休息”了吗?^_^
先想出这些,说的不对的还请各位指点,希望对LZ有帮助。
网友回复Z是在真机上测试的CPU占用率?用的什么工具?
网友回复:1.帧速太高 ,降低下看看
2.少用drawString
3.少画重复内容的image
4.不要在主循环里再套个长循环
5.假如是j2me的话尽量避免复杂的运算,看下有没更好的算法

网友回复:"1.帧速太高 ,降低下看看 "这是什么意思,帧可以降速吗?从没听说过,具体该怎么写呢,可以提供代码吗?
"2.少用drawString ",在程序中除非必要,要不我都没有用drawString.
"3.少画重复内容的image ",我在整理代码时已经修正过了.
"4.不要在主循环里再套个长循环 ",我本来很少用循环.
而且不是j2me的.
以上是我比对我的程序代码,得出的.
谢谢大家给我的宝贵经验!!


网友回复:不是j2me的你贴这来干嘛
网友回复:路过学习!呵呵!继续
网友回复:引用 22 楼 Class_Raito 的回复:
1.帧速太高 ,降低下看看
2.少用drawString
3.少画重复内容的image
4.不要在主循环里再套个长循环
5.假如是j2me的话尽量避免复杂的运算,看下有没更好的算法


赞成他的第3点,重新绘制图片会占用很多的CPU,要么你不刷新,要么你把图片改简单点或不要图片
网友回复:不画图,不刷新,这可不行
网友回复:顶,我是来学习的..
网友回复:我的程序是用JAVA语言写的,只不过不是用于手机的.原理和J2ME一样,难道不能在这里发帖吗?
网友回复:CPU的使用率如何降下来,还和什么有关呢?

网友回复:lz把线程结构发一下看看
网友回复:我是基于客户端写的,程序很长,这里是不够发的.
线程很简单,只是在INIT里面开了一个线程而已.

网友回复:帮忙顶一下
网友回复:帮帮忙
网友回复:先找出你程序的瓶颈所在,不然大家都在这里跟着你猜迷
我看到你说一直在调用repaint,我感到比较希奇,那个东西不都是在重绘的时候调用么?你一直在重绘么?什么系统需要你作复杂的算法,并且一直在重绘?
我感到很迷惑。是整个DC重绘还是某个小区与重绘?
不猜了,你最好把你瓶颈的程序拿出来,大家看看
网友回复:.....lz发到j2se区里面比较好吧,不把程序发出来我们也不好判定啊.
网友回复:晕....
网友回复:我知道是CPU为100%,CPU的调度算法估计我们也改不了,所谓我上面不是说了么“所以就有可能是你的进程调用了系统的什么东西,所以优先级高了,四个线程就一直占用着CPU啊,所以其他进程就很难得到CPU,所以机器就慢。”
假如算法复杂了,自然CPU要计算的时间就长了(CPU只是起计算作用)。就算你优化了算法,使得内存的使用降低了,CPU在一点范围内的使用率还是无法降低的。
当然我讲的都是一己之词。等待高手进来解决。
网友回复:sdfsadfsaf
网友回复:好,我先整理一下代码
网友回复:cpu占用100%,肯定是有线程在疯狂使用cpu,假如是长时间的,那基本就是死循环了,加sleep只能缓解,但不能从根本降低cpu
网友回复:请问各位高手,

在一个程序中有个货币转换的功能,为了让这个功能时时更新货币转换率,最新动态货币转换

有没有能帮我解决一下的,或者有相关资料也可以给提供的,谢谢!



网友回复:引用 42 楼 wangwang456 的回复:
请问各位高手,

在一个程序中有个货币转换的功能,为了让这个功能时时更新货币转换率,最新动态货币转换

有没有能帮我解决一下的,或者有相关资料也可以给提供的,谢谢!

可以发到我的邮箱里 :z_j188@163.com


这个没什么困难的,联网从服务器上实时更新汇率就行了。
网友回复:路过
网友回复:线程就是分割CPU的时间片, 我认为大量的数学运算与频繁的循环算法将导致CPU占用耗费很多时间, 也影响其它线程分享时间片段, 这样看起来就慢了一拍。

内存的优化和算法的优化同样重要。

BTW, 假如说J2ME和J2SE的区别,深入到CPU级别的话,也许是奔腾CPU和ARM的区别? 但我觉得关系不大, 究竟虚拟机基本原理是一样的。
网友回复:J2ME cpu占用率怎么看呢
网友回复:路过,学习!
网友回复:路过
网友回复:你在做什么啊? 代码问题啊!
网友回复:楼主截止到2008-06-17 16:32:05的汇总数据:
发帖数:1
结贴数:0
结贴率: 0.00%
网友回复:cpu利用率百分之百
不会是毒了吧
网友回复:该回复于2008-06-18 12:37:14被版主删除
网友回复:CPU的占用率是指单位时间内一个进程占用CPU时间片的数量比率。

线程就是分割CPU的时间片, 我认为大量的数学运算与频繁的循环算法将导致CPU占用耗费很多时间, 也影响其它线程分享时间片段, 这样看起来就慢了一拍。

内存的优化和算法的优化同样重要。
网友回复:该回复于2008-06-18 17:42:27被版主删除
网友回复:减小不必要的运算,那还用说么
网友回复:要害是别阻塞~~~
cpu闲着也是闲着
网友回复:讨论帖。。。 hoho
网友回复:= =看了半天不是J2ME 的。。。。。。。。。。。。。。。。。。。。
网友回复:少开点程序啊 !!!!!!!!!
网友回复:到服务治理器中把一些不用的服务关闭了
网友回复:路过帮顶.............
网友回复:study
up
study
网友回复:zan 22#----------
网友回复:路过学习。。。。。。。。。。。。。。。。。
网友回复:该回复于2008-06-23 10:29:50被版主删除
网友回复:原来是我的双缓冲有问题,我已经解决这个问题了。
在此,我非常感谢大家对我的指导!!


[ 本帖最后由 超越自我 于 2008-12-1 09:46 编辑 ]
作者: 咸菜    时间: 2010-5-13 11:57
hehe




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2