我想在我的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本身。
答案 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