【问题标题】:Java seems to ignore -Xms and -Xmx optionsJava 似乎忽略了 -Xms 和 -Xmx 选项
【发布时间】:2011-06-28 22:40:58
【问题描述】:

我想在我的 VPS 上运行一个用 java 编写的非常简单的机器人。 我想将 jvm 内存限制为 10MB(我怀疑它是否需要更多)。

我正在使用以下命令运行机器人:

java -Xms5M -Xmx10M -server -jar IrcBot.jar "/home/jbot"

但是top 显示为 java 保留的实际内存是144m(或者我在这里解释错了吗?)。

13614 jbot 17 0 144m 16m 6740 S 0.0 3.2 0:00.20 爪哇

有什么想法可以在这里出错吗?

Java 版本“1.6.0_20”Java(TM) SE 运行时环境(内部版本 1.6.0_20-b02)Java HotSpot(TM) 客户端 VM(内部版本 16.3-b01,混合模式)

顺便说一句。我正在运行 CentOS - 如果重要的话。

编辑: 谢谢您的回答。

我真的不能接受其中任何一个,因为事实证明问题出在我选择编写程序的语言上,而不是 JVM 本身。

【问题讨论】:

  • java 版本“1.6.0_20”Java(TM) SE 运行时环境(内部版本 1.6.0_20-b02)Java HotSpot(TM) 客户端 VM(内部版本 16.3-b01,混合模式)
  • 您可以编辑您的问题以澄清(例如,使用上面评论中的信息)。只需使用问题下方的“编辑”链接即可。
  • 知道 'top' 到底显示了什么是一个好的开始,除了堆大小选项和 java 也有几个不同的内存池。
  • 问题不在于语言。如果您尝试降低进程内存,请尝试将堆栈大小、perm gen 等设置为较低的值。如果您切换到更适合精简应用程序的替代 JVM(非 Sun / Oracle),则可能会获得更多收益。
  • 另外,虽然您不必接受任何答案。一个有效的答案不必“给你你想要的”——你想将你的进程大小减少到 10 MiB,这并不容易——你应该接受给你该信息的答案。

标签: java jvm vps


【解决方案1】:

-Xmx 指定最大 Java 分配(-Xms 指定最小 分配)。 Java 进程有它自己的开销(实际的 JVM 等),加上加载的类和 perm gen 空间(通过-XX:MaxPermSize=128m 设置)也在该值之外。

将您的堆分配简单地视为 Java 的“内部工作空间”,而不是整个进程。

尝试一下,你就会明白我的意思:

java -Xms512m -Xmx1024m ...

另外,尝试使用 JConsoleJVisualVM 等工具(两者都随 Sun / Oracle JDK 提供),您将能够看到实际的堆使用情况(以及用于限制大小的设置)。

最后,正如@Peter Lawrey 非常正确地指出的那样,驻留内存是这里的关键数字 - 在您的情况下,JVM 仅使用 16 MiB RSS(根据“顶部”)。只要 JVM 的堆没有被推入交换(非 RAM),共享/虚拟分配就不会引起任何问题。同样,正如我在一些 cmets 中所述,还有其他可用的 JVM——“Java”完全能够在低资源或嵌入式平台上运行。

【讨论】:

    【解决方案2】:

    Xmx 是最大 大小,但除此之外,JVM 还需要在内存中保留一些其他内容:堆栈、类等。简要介绍 @987654321 @。

    【讨论】:

      【解决方案3】:

      共享库中的 JVM 映射大约 150m。如果您试图最小化物理主内存,那么使用的虚拟内存量可能并不重要。

      您要查看的数字是常驻内存,即实际使用的物理主内存量(即 16 MB)

      【讨论】:

      • 我们能否从堆转储中确定仅堆内存的大小?
      • @Vipin 堆转储只转储堆(和线程堆栈)。无法在堆转储中识别堆外内存。堆转储的大小可以很好地指示进行转储时所占用的堆大小。
      猜你喜欢
      • 2021-06-26
      • 2012-08-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      相关资源
      最近更新 更多