Wie kann ich den Speicher erhöhen, der einem Prozess im Ubuntu-Server zugeordnet ist?

10085
GeeKay

Ich versuche, einen stark gleichzeitigen Messaging-Server einzurichten, und es scheint viel Speicher zu belegen. Derzeit ist unser Server-Betriebssystem Ubuntu und Server-Software ist in Java geschrieben. Unter Last erhalten wir keine Speicherausnahme, aber nur 70% meines 8 GB RAM werden verwendet.

Wie kann ich meinem Java-Prozess mehr Speicher zuweisen?

1
Welche Version von Ubuntu laufen Sie und welche Architektur ist das? Wenn Ihr Messaging-Anwendungsprozess 32-Bit hat, ist es möglich, dass der RAM-Speicher auf einmal begrenzt ist. user1055604 vor 11 Jahren 0

2 Antworten auf die Frage

3
Dennis

Soweit ich das beurteilen kann, gibt es vier Möglichkeiten:

  1. Ubuntu begrenzt den Speicher pro Prozess nicht standardmäßig, aber es gibt Möglichkeiten, diese Grenzwerte festzulegen. Der einfachste Weg, um zu wissen, was getan wurde (wenn überhaupt), besteht darin, die Person zu konsultieren, die den Server verwaltet.

  2. Wenn Sie sich auf einem VPS und nicht auf einem tatsächlichen Server befinden, liegt möglicherweise ein Problem mit der Konfiguration der VM vor.

  3. Ich weiß nicht genau, wie Java funktioniert, aber C beschränkt den verfügbaren Arbeitsspeicher beim Kompilieren. In diesem Fall können Sie den Compiler entweder anweisen, die Stapelgröße zu erhöhen, oder größere Arrays auf den Heap verschieben.

  4. Wenn Ihr Betriebssystem 32 Bit umfasst, ist der verfügbare Speicher pro Prozess stark eingeschränkt (zwischen 2 GB und 4 GB). Wenn Ihr Server über eine 64-Bit-CPU verfügt, kann dies leicht durch die Installation eines 64-Bit-Betriebssystems behoben werden.

Möglichkeit 4 ist ziemlich leicht auszuschließen. Um zu überprüfen, ob es 1, 2 oder 3 ist, können Sie Folgendes mit gcc kompilieren (oder das Äquivalent in Java schreiben):

#include <stdlib.h> #include <string.h>  int main(int argc, char **argv) { long bytes = atol(argv[1]), counter, *pointer, words = bytes / sizeof(long);  // try to allocate memory  if ((pointer = malloc(bytes)) == NULL) { puts("Could not allocate memory"); exit(1); }  // play with memory, so compiler won't optimize allocation out  for(counter = 0; counter < words; counter++) pointer[counter] = counter;  exit(0); } 

und führen Sie es so viel Speicher aus, wie Sie als Befehlszeilenoption zuweisen möchten.

Sie sollten in der Lage sein, allen gemeldeten Speicher als frei oder zwischengespeichert zu reservieren. Wenn möglich, schließen Sie Möglichkeit 1 und möglicherweise 2 aus.

0
jlliagre

Der größte Speicher, der von Java-Prozessen verwendet wird, ist der Heap, in dem die meisten Java-Objekte gespeichert werden. Standardmäßig ist es auf 1 GB oder einen Bruchteil des vorhandenen Speichers beschränkt. Wenn Sie keinen Heap-Speicherplatz mehr haben, haben Sie eine Java-Ausnahme für den Arbeitsspeicher. Sie können die Größe des Heapspeichers für eine JVM mithilfe der Option -Xmx vergrößern (oder verringern). z.B:

java -Xmx=2048m ... 

Wenn Sie eine 32-Bit-JVM verwenden, können Sie sie nicht zuverlässig auf ~ 2,5 bis 3 GB setzen. Sie müssen zu einer 64-Bit-JVM wechseln, um diese Einschränkung zu vermeiden.