【问题标题】:How much memory must be left to the OS with a java server application?java 服务器应用程序必须为操作系统保留多少内存?
【发布时间】:2015-08-04 22:57:57
【问题描述】:

假设我正在使用 -Xms256m -Xmx1024m 运行 tomcat,但想增加我的堆使用量。

我可以分配的最大安全堆大小是多少?

就这个问题而言,请假设系统有 5GB RAM,并且是一个 z/Linux 系统。但是,如果可能的话,我想要一个更广泛的经验法则答案。

这是专用系统,所以我主要担心操作系统的内存使用情况。我不担心其他程序。

另外,如果这是重复的,对不起。我很惊讶我没有找到关于这种事情的更多信息。

GC

PS:我知道可能需要更多系统信息。我不介意答案是否详细说明了如何找到答案,而不是给我一个数字。

【问题讨论】:

  • 指定多少内存都没关系,它只会使用它可以使用的东西
  • 除非您有大量的网络连接或其他不寻常的东西,否则几乎可以忽略操作系统内存使用情况,并在您确定需要多少 RAM 可用于缓存时添加一点点通常是可以接受的(将 I/O 工作集保存在 RAM 中)。您还应该为页表保留 1% 左右。
  • 您使用的是 x64 还是 x32 位机器?
  • @brso05 我的理解是使用过多的堆内存会导致操作系统分页过多。

标签: java linux tomcat heap-memory


【解决方案1】:

如果您完全关心性能,您将希望避免交换堆的所有成本。这意味着您必须确保系统上的总保留内存小于可用 RAM。

很难给出设置堆大小的经验法则,因为我们无法知道您的系统或应用程序的本机内存消耗。

例如,您的 Java 应用程序会为元空间和 JNI 数据等内容消耗本机内存。

我认为您能做的最好的事情就是以不太激进的堆大小运行应用程序(想想 5 GB RAM 系统上的 3 GB),以了解它通常消耗多少本机内存。

当您知道这一点后,您可以相应地调整堆大小,并确保留出一些内存(想想 10%)以防万一和用于操作系统级别的缓存

思考过程应该是这样的:

  • 当我在系统上什么都不运行时消耗的内存是 200 MB

  • 我的 java 应用程序通常消耗的本机内存为 300 MB

  • 我想要 500 MB 用于操作系统级缓存和“以防万一”

  • 然后我应该能够将我的最大堆大小设置为 5000 - 500 - 300 - 200 = 4000 MB

【讨论】:

  • 您忘记了 Java 虚拟机的内存大小不仅限于 Java 堆使用的内存大小。有本机堆,以及每个线程需要担心的 Java 和本机堆栈。开销(在堆顶部)有时会非常令人惊讶。我见过 JVM 使用的总内存是最大堆大小的两倍。
  • @ChristopherSchultz 这是我试图通过编写“例如,您的 Java 应用程序将消耗本机内存来存储元空间和 JNI 数据等内容”来表达的观点之一。而“本机内存通常由我的 java 应用程序消耗......”我的意思正是如此。不过,看来我的回答可以更清楚。
猜你喜欢
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多