Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以从Java应用程序控制CPU使用率?_Java_Streaming_Cpu Usage - Fatal编程技术网

是否可以从Java应用程序控制CPU使用率?

是否可以从Java应用程序控制CPU使用率?,java,streaming,cpu-usage,Java,Streaming,Cpu Usage,我正在开发一个通过HTTP传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常会将CPU的最大值设置为90-100%(这可能会导致用户在运行其他应用程序时出现问题) 是否可以控制执行此工作的线程使用更少的CPU,或者这需要由操作系统控制?目前有什么技术可以管理应用程序的密集程度吗 我知道可以以高/低优先级启动线程,但在这种情况下,这似乎对我没有任何影响 (我脑子里想不起来“我让电脑做了些什么,所以它显然会尽可能快地去做……” 谢谢 rod.您可

我正在开发一个通过HTTP传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常会将CPU的最大值设置为90-100%(这可能会导致用户在运行其他应用程序时出现问题)

是否可以控制执行此工作的线程使用更少的CPU,或者这需要由操作系统控制?目前有什么技术可以管理应用程序的密集程度吗

我知道可以以高/低优先级启动线程,但在这种情况下,这似乎对我没有任何影响

(我脑子里想不起来“我让电脑做了些什么,所以它显然会尽可能快地去做……”

谢谢


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
  • 压缩文件夹
  • 侵入式病毒检查器
  • 环回文件系统

VisualVM非常容易使用,可以找出Java应用程序的CPU时间花费在哪里,它包含在最新版本的JDK中(在Windows上命名为jvisualvm.exe)

我会检查你使用了多少缓冲。如果你一次读/写一个字节,你将消耗大量CPU。但是,如果你读/写4KB的数据块,它应该不会占用太多CPU。如果你的网络是internet,你的CPU不应该超过单个客户端的10%

缓冲区大小的一个近似值是带宽*延迟。例如,如果您希望用户以500 KB/s的速度传输数据,并且网络延迟高达0.1秒,那么缓冲区大小应该在50 KB左右。

跟进我的“深思熟虑的缓冲区”注释,这是TCP缓冲的一个很好的经验法则, 缓冲区大小=2*带宽*延迟


因此,如果你想以214kbps(约27kB/s)的速度播放音乐,并且有60毫秒的延迟,那么你需要3.24kb的数据,四舍五入到一个不错的4kB缓冲区,这在很多系统上都非常适合你。

降低优先级肯定是一个好办法。这意味着你的应用程序将尽可能快(即使用尽可能多的CPU)但是,如果任何其他应用程序需要CPU时间,它都可以得到它。在已经运行的线程上设置优先级可能无法工作。无论如何,它可能不会做任何事情。我曾经听到一个关于不修复内存泄漏的论点,这个答案让我想起了这个论点,它大致如下:,“进程的全部目的是分配内存,所以除非它阻塞了其他操作,否则不要修复它。“不用说,我不认为这是最好的解决办法。@marr75:此外,引用的论点既空洞又似是而非——进程的目的不是为了分配内存,而是为了完成某些任务;在这样做时,它应该使用尽可能少的内存。”