【问题标题】:How to restrict the Java VM overall memory consumption?如何限制 Java VM 的整体内存消耗?
【发布时间】:2013-09-22 10:23:05
【问题描述】:

我在 Linux 集群上运行 Java 应用程序,并使用 SLURM 作为资源管理器。要运行我的应用程序,我必须为 SLURM 指定我需要的内存量。 SLURM 将在具有指定内存量的虚拟机中运行我的应用程序。为了告诉我的 java 应用程序可以使用多少内存,我使用了“-Xmx##g”参数。我选择它比我从 SLURM 请求的少 1GB。

我的问题是我超出了我在 SLURM 上选择的内存量,它终止了我的应用程序。看来 JVM 使用了大约 1GB 的内存,可能用于 GC 之类的东西。

是否有可能限制 JVM 的大小或至少驯服它。

干杯, 马库斯

【问题讨论】:

  • 你使用了很多线程吗?他们的堆栈需要内存(我认为默认为 1mb),这可能不受 Xmx 参数的限制。
  • @inflagranti 我正在使用 6 个线程。默认情况下,1mb 的大小可能不足以解释它崩溃的原因。
  • @Thomas 我看过这个问题,但答案是:使用我已经在使用的“-Xmx##”参数。

标签: java linux memory jvm


【解决方案1】:

最大堆设置仅限制最大堆。还有其他你没有限制的内存区域,例如

  • 线程堆栈
  • 烫发
  • 共享库
  • 库使用的本机内存
  • 直接记忆
  • 内存映射文件。

如果您想限制所有内存使用量,您需要明确您是限制虚拟内存还是常驻内存。监控工具通常会犯监控虚拟内存的错误,这表明您对应用程序的工作方式甚至为什么首先监控应用程序缺乏了解。

您想要监控常驻内存的使用情况,这意味着您需要知道您的应用程序在一段时间内使用了多少内存而不是堆,然后计算出您可以拥有多少堆以及一些错误余量。

。为了告诉我的 java 应用程序可以使用多少内存,我使用了“-Xmx##g”参数。我选择它比我从 SLURM 请求的少 1GB。

我猜测我会从 -Xmx512m 的 1/2 GB 开始,看看什么是峰值驻留内存,如果你发现总是有几百 MB 的空间,则增加它。

顺便说一句,如今 1 GB 内存的成本并不高(低至 5 美元)。您的时间可能比您试图节省的资源更有价值。

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2022-10-05
    • 2015-11-30
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多