说,“运行myApp.jar,cpu = 800,内存= 1024”
多年来我一直在做java编程,问这个问题是个尴尬。我甚至不知道这是否可能。如果是这样,怎么样?
我只想知道是否可以设置java程序的最大内存和CPU使用率。我突然想到了这一点,因为我最近开始开发移动应用程序。我想知道应用程序在具有非常有限的内存和处理器的设备上的行为方式。
我看到物理引擎带有在浏览器上运行的演示应用程序,或者我可以在我的PC上执行。如果我在移动设备上运行它会怎么样?性能是否相同?我不是开发一个示例移动应用程序来测试库的性能,而是首先使用我的PC运行特定的cpu和内存。
顺便说一下,我试着谷歌搜索...我发现只是监控和性能调整。我可能使用了错误的关键字。
答案 0 :(得分:11)
您可以通过-Xmx选项限制内存使用量,并且可以通过设置进程的优先级和/或CPU亲和力来限制CPU使用率。
答案 1 :(得分:4)
JVM无法控制CPU使用率和优先级。
JVM可以控制最大/最小内存使用量。
有一种解决方法。可以在单独的Docker container中运行每个JVM。并控制每个容器的资源(内存,CPU,网络,IO)分配。这正是Docker容器的附加价值。
答案 2 :(得分:0)
在这种情况下,在移动模拟器(例如Android)上运行应用程序可能会有所帮助。
通过此功能,您可以模拟具有特定CPU /内存的移动设备。因此,您应该获得性能,这与具有较慢CPU和较低RAM的设备相当。
Android / Nokia模拟器是免费的,可从诺基亚/谷歌网站的开发者部分下载。
答案 3 :(得分:0)
https://github.com/haosdent/jcgroup jcgroup是您的最佳选择。您可以使用此库来限制CPU份额,磁盘I / O速度,网络带宽等。
答案 4 :(得分:0)
请在运行jvm 8或更早版本时注意内存和CPU选项。 关于这方面有很多非常好的文章。检查一下:
https://developers.redhat.com/blog/2017/03/14/java-inside-docker/
https://jaxenter.com/nobody-puts-java-container-139373.html
话虽如此,容器化-无论堆栈如何,都是采用微服务架构的正确方法,而jvm也不例外。但是,请注意这些警告很重要。
答案 5 :(得分:0)
Docker提供了资源管理选项,用于限制对运行docker容器的cpu访问。看一下Docker文档中Limit a container's resources中docker run
可提供的CFS调度程序选项,例如:
--cpus=<value>
-指定一个容器可以使用多少可用CPU资源。例如,如果主机有两个CPU,并且您设置了--cpus="1.5"
,则可以保证容器最多容纳一半的CPU。这等效于设置--cpu-period="100000"
和--cpu-quota="150000"
。在Docker 1.13和更高版本中可用。--cpuset-cpus
-限制容器可以使用的特定CPU或内核。如果一个或多个CPU,则容器可以使用逗号分隔的列表或以连字符分隔的CPU范围。第一个CPU的编号为0。有效值可能是0-3
(使用第一,第二,第三和第四CPU)或1,3
(使用第二和第四CPU)。
在部署Docker群集/堆栈时,也可以通过docker-compose使用这些选项,如resources
下的Compose file version 3 reference所述:
version: '3' services: redis: image: redis:alpine deploy: resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M```
注意:现在docker compose v2中的legacy resource options仅限于migration to v3中的堆栈。
答案 6 :(得分:0)
Linux:
taskset -a -c 0,1,2,3 <program>
仅在核心0、1、2和3上运行程序及其子线程。
答案 7 :(得分:-1)
对于CPU,您可以尝试我的新lib:)。
https://github.com/dyorgio/cpu-watcher
使用示例:
// Limit process by PID to 25% of host cpu usage
CpuWatcher cpuWatcher = new CpuWatcher(pid, 25f);
cpuWatcher.start();