Java似乎忽略了-Xms和-Xmx选项
我想在我的VPS上运行一个用java编写的非常简单的bot。 我想把jvm内存限制在10MB(我怀疑它还需要更多) 我正在使用以下命令运行bot: java-Xms5M-Xmx10M-server-jar IrcBot.jar“/home/jbot” 但是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(
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 ...
另外,尝试使用JConsole或JVisualVM等工具(两者都是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堆转储仅转储堆(和线程堆栈)。无法在堆转储中识别堆外内存。堆转储的大小很好地指示了转储时占用的堆大小。