Wie kann ich den einem Prozess auf einem Ubuntu-Server zugewiesenen Speicher erhöhen?

Wie kann ich den einem Prozess auf einem Ubuntu-Server zugewiesenen Speicher erhöhen?

Ich versuche, einen Messaging-Server mit hoher Parallelität einzurichten, und dieser scheint viel Speicher zu verbrauchen. Derzeit ist unser Server-Betriebssystem Ubuntu und die Serversoftware ist in Java geschrieben. Unter Last erhalten wir eine Speicherausnahme, aber nur 70 % meines 8-GB-RAM werden verwendet.

Wie kann ich meinem Java-Prozess mehr Speicher zuweisen?

Antwort1

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 Grenzen festzulegen. Am einfachsten erfahren Sie, was getan wurde (falls überhaupt etwas getan wurde), indem Sie die Person befragen, die den Server verwaltet.

  2. Wenn Sie einen VPS und keinen tatsächlichen Server verwenden, liegt möglicherweise ein Problem mit der Konfiguration der VM vor.

  3. Ich weiß nicht genau, wie Java funktioniert, aber C beschränkt den Speicher, der dem Stapel beim Kompilieren zur Verfügung steht. 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 ist, ist der verfügbare Speicher pro Prozess stark begrenzt (irgendwo zwischen 2 GB und 4 GB). Wenn Ihr Server eine 64-Bit-CPU hat, lässt sich das leicht beheben, indem Sie ein 64-Bit-Betriebssystem installieren.

Möglichkeit 4 lässt sich relativ einfach ausschließen. Um zu überprüfen, ob 1, 2 oder 3 zutrifft, 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 mit der Speichermenge aus, die Sie als Befehlszeilenoption zuordnen möchten.

Sie sollten in der Lage sein, den gesamten Speicher zuzuweisen, der als frei oder zwischengespeichert gemeldet wird. Wenn Sie dies können, schließen Sie Möglichkeit 1 und möglicherweise 2 aus.

Antwort2

Der größte von Java-Prozessen verwendete Speicher ist der Heap, in dem die meisten Java-Objekte gespeichert sind. Standardmäßig ist er auf 1 GB oder einen Bruchteil des vorhandenen Speichers begrenzt. Wenn der Heap-Speicherplatz voll ist, wird eine Java-Ausnahme wegen unzureichendem Arbeitsspeicher angezeigt. Sie können die Größe des Heaps für eine JVM mit der Option -Xmx erhöhen (oder verringern). Beispiel:

java -Xmx=2048m ...

Wenn Sie eine 32-Bit-JVM verwenden, können Sie sie nicht zuverlässig auf mehr als ca. 2,5 bis 3 GB einstellen. Um diese Einschränkung zu umgehen, müssen Sie auf eine 64-Bit-JVM umsteigen.

verwandte Informationen