【问题标题】:Multiple JVMs with sum of -xms greater than host's RAM-xms 总和大于主机 RAM 的多个 JVM
【发布时间】:2019-01-21 19:51:34
【问题描述】:

注意:我是 Java 新手(我是一名 Python 开发人员;JVM 的想法对我来说很陌生)

假设您有一台配备 8 核 160GB RAM 的服务器

如果您使用 -xms 100G 运行 Java 程序,它不会抛出任何错误。 如果您使用 -xms -100G 运行两个或更多 Java 程序(多个 JVM)怎么办? 如果内存允许,是否可以在同一主机上运行多个 JVM?

任何参考将不胜感激!

【问题讨论】:

  • 请注意——根据我的经验,如果多个 java VM 确实超出了您的机器内存,它往往会导致整个系统自行抖动,直到您只能按下电源开关才能做任何事情。如果它只是一个虚拟机,我认为我从未见过这种行为。自从我们的 32gb 机器投入使用以来,它已经好多了,所以我已经好几年没见过了。

标签: java


【解决方案1】:

没有(理智的)操作系统会给你实际内存来支持你的需求,听说过swap space吗?对于python也是如此,内存管理也不例外,因为python仍然使用虚拟内存,对吧?

如果你真的希望你的虚拟机的内存由物理内存备份,有一个标志:-XX:+AlwaysPreTouch,但使用它意味着你的虚拟机使用的所有内存必须归零(“触摸”),这意味着它的启动速度会较慢 - 对于如此大量的内存尤其如此。

-Xmx-Xms 实际上只是启动标志,它们告诉您所需的初始内存和所需的最大内存(通常它们具有相同的值),但这仍然是 虚拟内存 正在从操作系统询问。

【讨论】:

  • 我也从未深入了解 python 的内存使用情况。但是我从来没有预先运行过任何内存要求的 python 程序,因此我不知道为什么 JVM 会预先要求。因此,由于 -xms 用作虚拟内存,如果我使用大于主机上可用内存的 -xms 运行 java 程序,它不会抱怨?我主要关心的是java程序是否会因为一开始的内存不足而启动
  • 如果它被用作虚拟内存并且不反映物理内存的可用性,那么指定 -xms 有什么意义?
  • 所以如果我指定 100G 的堆内存,那是多少物理内存?它实际上是在物理内存中分配任何东西还是都是虚拟的?
  • @ealeon 虚拟内存通常是交换 + RAM,但我猜不同的操作系统可能会以不同的方式对待它;还有更多细节here。我刚刚在我的 mac 上尝试了-Xms120G - 它并没有失败,但可能会在 Windows 上... 我主要担心的是 java 程序是否会因为内存不足而启动开始 - 这在很大程度上取决于操作系统及其配置,java 毕竟只是一个从运行它的主机请求内存的进程。您需要有关这些内容的操作系统手册...
  • @ealeon 顺便说一句,如果我在我的 Mac 上运行 java -Xms120G -XX:+AlwaysPreTouch,它将执行 very 缓慢并最终以 'java -Xms120G -XX:+AlwaysPreTou…' terminated by signal SIGKILL (Forced quit)
【解决方案2】:

-xms 定义了 JVM 的最低强制要求。如果内存可用,则在启动 JVM 时,它将毫无问题地出现。多个 JVM 启动也是如此。 简而言之,只要满足最低内存要求,JVM 就会成功启动。

http://blog.paulgu.com/java/6-common-errors-in-setting-java-heap-size/

【讨论】:

  • 所以 -xms 定义的内存是每个 JVM 独有的,即如果我想要两个每个 100GB 的 Java 程序,我需要主机有 200GB 内存吗?
  • 如果两个 java 程序的最低要求是 100 GB 并且 -xms 设置为该值,那么是的,您需要 200 GB RAM
  • 通常你不应该把下限保持这么高,直到非常必要。 -xmx 应该设置为高值,这是您的程序在最坏情况下将消耗的内存。
  • 将 -xms 保持在高值意味着您正在浪费资源,因为可能根本没有使用那么多内存
猜你喜欢
  • 1970-01-01
  • 2019-11-01
  • 2011-09-03
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多