限制java应用程序的内存和cpu使用

z9ju0rcb  于 2022-12-10  发布在  Java
关注(0)|答案(9)|浏览(764)

假设“运行myApp.jar,CPU=800,内存=1024”
我做java编程已经很多年了,问这个问题很尴尬。我甚至不知道这是否可能。如果可能,怎么做?
我只是想知道是否可以设置一个java程序的最大内存和cpu使用率。我突然想到这一点,因为我最近开始开发移动的应用程序。我想知道应用程序将如何在设备上的行为,这是非常有限的内存和处理器。
我看到物理引擎的演示应用程序可以在浏览器上运行,也可以在我的PC上执行。如果我在移动的设备上运行它们呢?性能会一样吗?与其开发一个示例移动应用程序来测试库的性能,我宁愿先在我的PC上使用特定的CPU和内存运行它。
顺便说一句,我试着在谷歌上搜索...我发现的只是监控和性能调优。我可能用错了关键字。

xa9qqrwz

xa9qqrwz1#

您可以通过-Xmx选项限制内存使用,也可以通过设置进程的优先级和/或CPU关联性来限制CPU使用。

8yoxcaq7

8yoxcaq72#

JVM无法控制CPU使用率或优先级。
JVM可以控制最大/最小内存使用量。
有一个解决方案。可以在单独的[Docker container][1]中运行每个JVM。并控制每个容器的资源(内存、CPU、网络、IO)分配。这正是Docker容器的附加值。
[1]JVM不能控制CPU的使用和优先级。但是你可以在一个单独的Docker容器中运行每个JVM。并且控制每个容器的资源分配。这正是Docker容器的附加价值。

7ivaypg9

7ivaypg93#

Linux操作系统:
taskset -a -c 0,1,2,3 <program>
仅在内核0、1、2和3上运行程序及其子线程。

rur96b6h

rur96b6h4#

Docker提供了资源管理选项来限制运行Docker container的cpu访问。在Docker文档中的Limit a container 's resources中,可以查看docker run提供的CFS调度程序选项,例如:

  • --cpus=<value>-指定一个容器可以使用多少可用CPU资源。例如,如果主机有两个CPU,而您设置了--cpus="1.5",则容器最多只能使用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 swarm / stack时,这些选项也可通过docker-compose获得,如在resources下的Compose file version 3参考中所述:

version: '3'
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 50M
        reservations:
          cpus: '0.25'
          memory: 20M```

**注意:**Docker compose v2中的传统资源选项现在仅限于迁移到v3中的堆栈。

r1zhe5dt

r1zhe5dt5#

对于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();
7cwmlq89

7cwmlq896#

在运行jvm 8或更早版本时,请注意内存和CPU选项。有几篇关于这方面的文章非常不错。请查看:
https://developers.redhat.com/blog/2017/03/14/java-inside-docker/
https://jaxenter.com/nobody-puts-java-container-139373.html
话虽如此,容器化是微服务架构的正确方法,无论堆栈如何,jvm也不例外。然而,注意到警告是很重要的。

rqenqsqc

rqenqsqc7#

在这种情况下,在移动的模拟器(例如Android)上运行应用程序可能会有所帮助。
有了这个,你可以模拟一个具有特定CPU/内存的移动的设备。所以,你应该得到的性能可以与一个CPU较慢,RAM较少的设备相媲美。
Android / Nokia模拟器是免费,可从Nokia/Google网站的开发人员部分下载。

cclgggtu

cclgggtu8#

https://github.com/haosdent/jcgroup jcgroup是您的最佳选择。您可以使用此库来限制CPU共享、磁盘I/O速度、网络带宽等。

jaxagkaj

jaxagkaj9#

对于资源受限的系统,我曾经发现以下java命令行选项对我的特定用例很有帮助(使用OpenJDK 17测试)。-Xms,最大值:-Xmx)、绝对最大RAM,并且还设置为仅使用串行垃圾收集器,以减少自发的CPU负载突发:
java -Xmx512m -Xms128m -XX:MaxRAM=1536m -XX:+UseSerialGC
当然,您必须确定您的应用程序是否仍能使用这些设置。

相关问题