Java scheint die Optionen -Xms und -Xmx zu ignorieren

8

Ich würde gerne einen sehr einfachen Bot in Java auf meinem VPS laufen lassen. Ich möchte den JVM-Speicher auf 10MB begrenzen (ich bezweifle, dass es mehr benötigt).

Ich betreibe den Bot mit dem folgenden Befehl:

  

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

Aber top zeigt an, dass der tatsächliche Speicher, der für Java reserviert ist, 144m ist (oder interpretiere ich die Dinge hier falsch?).

  

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

Irgendwelche Ideen, was hier falsch sein kann?

Java-Version "1.6.0_20" Java (TM) SE Laufzeitumgebung (Build 1.6.0_20-b02) Java HotSpot (TM) Client-VM (Build 16.3-b01, gemischter Modus)

Übrigens. Ich betreibe CentOS - wenn es darauf ankommt.

BEARBEITEN: Danke für deine Antworten.

Ich kann keine von ihnen wirklich akzeptieren, da sich herausstellt, dass das Problem in der Sprache liegt, in der ich das Programm schreibe, nicht in der JVM selbst.

    
Itako 23.06.2011, 06:29
quelle

3 Antworten

9

-Xmx gibt die maximale Zuordnung von Java Heap an ( -Xms gibt die Zuordnung min Heap an). Der Java-Prozess hat einen eigenen Overhead (die eigentliche JVM usw.), und die geladenen Klassen und der Permergen-Space (gesetzt über -XX:MaxPermSize=128m ) befinden sich auch außerhalb dieses Wertes.

Stellen Sie sich Ihre Heap-Zuweisung einfach als "internen Arbeitsraum" von Java vor, nicht als Prozess.

Versuche zu experimentieren und du wirst sehen, was ich meine:

%Vor%

Versuchen Sie auch, ein Tool wie JConsole oder JVisualVM zu verwenden (beide werden mit dem Sun / Oracle JDK ausgeliefert) und Sie können grafische Darstellungen von sehen die tatsächliche Heap-Verwendung (und die Einstellungen, die Sie zum Einschränken der Größe verwendet haben).

Schließlich, wie Peter Lawrey zu Recht feststellt, ist das Resident Memory hier die entscheidende Zahl - in Ihrem Fall verwendet die JVM nur 16 MiB RSS (laut 'top'). Die gemeinsame / virtuelle Zuweisung wird keine Probleme verursachen, solange der Heap der JVM nicht in Swap (nicht-RAM) verschoben wird. Wie ich bereits in einigen Kommentaren ausgeführt habe, gibt es noch andere JVMs - "Java" ist durchaus in der Lage, auf Low-Resource- oder Embedded-Plattformen zu laufen.

    
Mikaveli 23.06.2011, 06:43
quelle
6

Die JVM mappt in shared libraries, die ungefähr 150m sind. Es ist unwahrscheinlich, dass die Größe des verwendeten virtuellen Speichers wichtig ist, wenn Sie versuchen, den physischen Hauptspeicher zu minimieren.

Die Zahl, die Sie betrachten möchten, ist der residente Speicher, der die Menge des tatsächlich verwendeten physischen Hauptspeichers (16 MB) beträgt.

    
Peter Lawrey 23.06.2011 06:51
quelle
5

Xmx ist die maximale Heap Größe, aber darüber hinaus gibt es noch ein paar andere Dinge, die die JVM im Speicher behalten muss: den Stack, die Klassen usw. Für eine kurze Einführung siehe diesen Beitrag über die JVM-Speicherstruktur .

    
Theo 23.06.2011 06:43
quelle

Tags und Links