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

Java似乎忽略了-Xms和-Xmx选项,java,jvm,vps,Java,Jvm,Vps,我想在我的VPS上运行一个用java编写的非常简单的bot。 我想把jvm内存限制在10MB(我怀疑它还需要更多) 我正在使用以下命令运行bot: java-Xms5M-Xmx10M-server-jar IrcBot.jar“/home/jbot” 但是top显示为java保留的实际内存是144m(或者我在这里解释错误了吗?) 13614 jbot 17 0144m16m 6740 S 0.0 3.2 0:00.20 java 你知道这里有什么不对吗 Java版本“1.6.0_20”Java(

我想在我的VPS上运行一个用java编写的非常简单的bot。 我想把jvm内存限制在10MB(我怀疑它还需要更多)

我正在使用以下命令运行bot:

java-Xms5M-Xmx10M-server-jar IrcBot.jar“/home/jbot”

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

13614 jbot 17 0144m16m 6740 S 0.0 3.2 0:00.20 java

你知道这里有什么不对吗

Java版本“1.6.0_20”Java(TM)SE运行时环境(构建1.6.0_20-b02)Java热点(TM)客户端虚拟机(构建16.3-b01,混合模式)

顺便说一句,如果有关系的话,我正在运行CentOS

编辑: 谢谢你的回答


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

Xmx
是最大堆大小,但除此之外,JVM还需要在内存中保存一些其他东西:堆栈、类、,以此类推。

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

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

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

java -Xms512m -Xmx1024m ...
另外,尝试使用JConsoleJVisualVM等工具(两者都是Sun/Oracle JDK附带的),您将能够看到实际堆使用情况的图形表示(以及用于限制大小的设置)


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

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


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

java版本“1.6.0_20”java(TM)SE运行时环境(build 1.6.0_20-b02)java HotSpot(TM)客户端VM(build 16.3-b01,混合模式)您可以编辑问题以澄清(例如,使用上面评论中的信息)。只需使用“编辑”问题下方的链接。了解“top”到底显示了什么是一个好的开始,此外选项是堆大小,java也没有几个不同的内存池。问题不在语言中。如果您试图降低进程内存,请尝试将堆栈大小、perm gen等设置为较低的值。如果您切换到alterna,则可能会获得更多收益动态JVM(非Sun/Oracle)另外,虽然您不必接受任何答案。有效答案不必“给您想要的”-您希望将进程大小减少到10 MiB,但这并不容易-您应该接受提供该信息的答案。我们是否可以从堆转储中仅识别堆内存的大小?@Vipin堆转储仅转储堆(和线程堆栈)。无法在堆转储中识别堆外内存。堆转储的大小很好地指示了转储时占用的堆大小。