Java似乎忽略了-Xms和-Xmx选项

时间:2011-06-23 06:29:07

标签: java jvm vps

我想在我的VPS上运行一个用java编写的非常简单的bot。 我想限制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

任何想法在这里可能出错?

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

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

编辑: 谢谢您的回答。

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

3 个答案:

答案 0 :(得分:10)

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

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

尝试实验,你会明白我的意思:

java -Xms512m -Xmx1024m ...

此外,尝试使用 JConsole JVisualVM 等工具(两者都附带Sun / Oracle JDK),您将能够看到图形表示实际堆使用情况(以及用于约束大小的设置)。

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

答案 1 :(得分:6)

JVM映射在大约150米的共享库中。如果您尝试最小化物理主内存,则使用的虚拟内存量不太可能很重要。

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

答案 2 :(得分:5)

Xmx是最大大小,但除此之外,还有一些JVM需要保留在内存中的其他东西:堆栈,类等。简要介绍see this post about the JVM memory structure