首页 文章

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

提问于
浏览
10

说,“运行myApp.jar,cpu = 800,内存= 1024”

我已经做了多年的java编程,问这个问题是一个尴尬 . 我甚至不知道这是否可能 . 如果是这样,怎么样?

我只想知道是否可以设置java程序的最大内存和CPU使用率 . 我突然想到了这一点,因为我最近开始开发移动应用程序 . 我想知道应用程序在具有非常有限的内存和处理器的设备上的行为 .

我看到物理引擎带有在浏览器上运行的演示应用程序,或者我可以在我的PC上执行 . 如果我在移动设备上运行它会怎么样?性能是否相同?我不是开发一个示例移动应用程序来测试库的性能,而是首先使用我的PC运行特定的cpu和内存 .

顺便说一下,我试着谷歌搜索...我发现只是监控和性能调整 . 我可能使用错误的关键字 .

7 回答

  • 11

    您可以通过-Xmx选项限制内存使用量,并且可以通过设置进程的优先级和/或CPU关联来限制CPU使用率 .

  • -1

    JVM无法控制CPU使用率和优先级 .

    JVM可以控制最大/最小内存使用率 .

    有一个解决方法 . 可以在单独的Docker container中运行每个JVM . 并控制每个容器的资源(内存,CPU,网络,IO)分配 . 这正是Docker容器的附加 Value .

  • 0

    在这种情况下,在移动模拟器(例如Android)上运行应用程序可能会有所帮助 .

    通过此,您可以模拟具有特定CPU /内存的移动设备 . 因此,您应该获得性能,这与具有较慢CPU和较低RAM的设备相当 .

    Android / Nokia模拟器是免费的,可从诺基亚/谷歌网站的开发者部分下载 .

  • 0

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

  • 3

    运行jvm 8或更早版本时,请注意内存和CPU选项 . 关于这一点,有一些非常好的文章 . 看看这个:

    https://developers.redhat.com/blog/2017/03/14/java-inside-docker/

    https://jaxenter.com/nobody-puts-java-container-139373.html

    话虽如此,容器化 - 无论堆栈如何都是微服务架构的正确方法,而jvm并不是例外 . 然而,重要的是要注意警告 .

  • 0

    Docker提供了资源管理选项,用于限制运行docker容器的cpu访问 . 在Docker文档中查看来自Limit a container's resourcesdocker 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 swarm / stack时,这些选项也可以通过docker-compose获得,如Compose file version 3 referenceresources 所述:

    版本:'3'
    服务:
    Redis的:
    图像:redis:高山
    部署:
    资源:
    限制:
    cpus:'0.50'
    记忆:50M
    预约:
    cpus:'0.25'
    记忆:20M```

    Note: ,docker撰写v2中的legacy resource options现在仅限于migration to v3中的堆栈 .

  • 0

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

相关问题