是否可以从Java应用程序控制CPU使用率?
我正在开发一个通过HTTP传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常会将CPU的最大值设置为90-100%(这可能会导致用户在运行其他应用程序时出现问题) 是否可以控制执行此工作的线程使用更少的CPU,或者这需要由操作系统控制?目前有什么技术可以管理应用程序的密集程度吗 我知道可以以高/低优先级启动线程,但在这种情况下,这似乎对我没有任何影响 (我脑子里想不起来“我让电脑做了些什么,所以它显然会尽可能快地去做……” 谢谢是否可以从Java应用程序控制CPU使用率?,java,streaming,cpu-usage,Java,Streaming,Cpu Usage,我正在开发一个通过HTTP传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常会将CPU的最大值设置为90-100%(这可能会导致用户在运行其他应用程序时出现问题) 是否可以控制执行此工作的线程使用更少的CPU,或者这需要由操作系统控制?目前有什么技术可以管理应用程序的密集程度吗 我知道可以以高/低优先级启动线程,但在这种情况下,这似乎对我没有任何影响 (我脑子里想不起来“我让电脑做了些什么,所以它显然会尽可能快地去做……” 谢谢 rod.您可
rod.您可以使用Thread中的方法降低它的优先级(如果需要,可以通过Thread.currentThread() 您还可以在它的处理循环(Thread.sleep())中设置延迟 除此之外,让O/S来处理它。如果您的程序可以使用100%的CPU,并且没有其他需要CPU的东西,那么您的应用程序也可以使用它,而不是让O/S空闲任务拥有它 流数据应该是I/O绑定的,这也是事实,因此您应该明确地回顾在读取数据和发送数据之间所做的工作。例如,您是否正在逐字节读取/发送未缓冲的数据 编辑:作为对marr75评论的回应,我绝对不主张编写浪费CPU资源的低劣、低效的代码——有一种方法可以清楚地表达我对这种思维定势的看法。相反,我想说的是,如果你的代码合法地需要CPU,并且如果用户想做其他事情,你已经优先考虑了它,让它表现得很好,那么人为地推迟结果完全没有意义,只是为了避免钉住CPU——这只会让用户为最终结果等待更长的时间,这可能是他们希望尽快完成的任务。该任务(从磁盘读取文件并通过HTTP发送)不应占用大量CPU,尤其是在音乐流所需的比特率下(除非您谈论的是多通道未压缩PCM或类似的东西,但即使如此,它也应该是I/O绑定的,并且不使用大量CPU)
您可能正在以一种非常低效的方式进行读/写操作。您是单独读/写每个字节还是使用某种缓冲区?我认为您无法降低优先级而不丢失功能(流音乐)。你的程序从操作系统获得这么多的cpu,因为它需要。这不像是操作系统无缘无故地浪费cpu时间,或者是因为“它有心情这样做” 如果您认为,您可以在不使用太多cpu利用率的情况下完成任务,您可以分析您的应用程序,找出cpu利用率高的原因,然后尝试改进代码 我认为你做流媒体的方式效率很低,但我说流媒体可以是一项利用率很高的任务 我重复一遍,不要想通过降低进程优先级或告诉操作系统“不要给这个进程太多的cpu时间”来降低cpu利用率。在我看来,这完全是错误的直觉。在评测之后,通过改进算法和代码来降低cpu利用率
本文是分析java的一个良好开端:除了上面给出的信息之外:JVM在如何使用操作系统线程方面是免费的。java应用程序中的线程可能在单独的操作系统线程中运行,或者可能与其他线程共享该线程。有关更多信息,请查看所使用JVM的文档。好的,谢谢大家的建议!看来我要努力提高我的应用程序的流式传输方式的效率了(虽然我不确定这是否会走得更远,因为我基本上只是从磁盘读取文件并将其写入客户端…。您有一个或多个:
- 软件RAID
- 压缩文件夹
- 侵入式病毒检查器
- 环回文件系统
因此,如果你想以214kbps(约27kB/s)的速度播放音乐,并且有60毫秒的延迟,那么你需要3.24kb的数据,四舍五入到一个不错的4kB缓冲区,这在很多系统上都非常适合你。降低优先级肯定是一个好办法。这意味着你的应用程序将尽可能快(即使用尽可能多的CPU)但是,如果任何其他应用程序需要CPU时间,它都可以得到它。在已经运行的线程上设置优先级可能无法工作。无论如何,它可能不会做任何事情。我曾经听到一个关于不修复内存泄漏的论点,这个答案让我想起了这个论点,它大致如下:,“进程的全部目的是分配内存,所以除非它阻塞了其他操作,否则不要修复它。“不用说,我不认为这是最好的解决办法。@marr75:此外,引用的论点既空洞又似是而非——进程的目的不是为了分配内存,而是为了完成某些任务;在这样做时,它应该使用尽可能少的内存。”