So reduzieren Sie den Spring-Speicherbedarf

7

Ich möchte Sie fragen, wie (oder IF) es möglich ist, den RAM-Footprint von Spring Framework zu reduzieren.

Ich habe eine einfache helloworld App zur Demonstration des Problems erstellt. Es gibt nur zwei Klassen und eine context.xml-Datei:

  • Main - Klasse mit Hauptmethode
  • Test - Klasse zum Simulieren einiger "Arbeiten" (printig Hello in Endlosschleife)

context.xml enthält nur das:

%Vor%

Testklasse enthält nur Metode namens init , benannt nach Konstruktion:

%Vor%

Ich habe zwei Szenarien vorbereitet und in beiden enthält main method nur eine Zeile.

Im ersten Szenario macht dies die Hauptmethode: (new Test()).init(); App funktioniert ohne Spring und verbraucht nur ca. 8 MB RAM.

Im zweiten Szenario enthält die Hauptmethode folgendes: new ClassPathXmlApplicationContext(new String[]{"spring/context.xml"}); Die App wird also über den Spring Container initialisiert und verbraucht ca. 45 MB RAM!

Gibt es eine Möglichkeit, diesen zusätzlichen Speicher zu reduzieren (im besten Fall vollständig loszuwerden)? Bisher konnte ich keine passende Lösung finden.

Es macht mir nichts aus, wenn beim Start mehr Speicher verbraucht wird - das ist völlig in Ordnung, aber danach muss ich unsere App reduzieren.

(Die Geschichte hinter dieser Frage ist ein bisschen komplizierter, aber das ist für mich jetzt das Kernproblem.)

Danke

    
Kousalik 05.03.2014, 15:11
quelle

1 Antwort

27

Zuerst ein paar Dinge, die Sie vielleicht schon wissen, aber wichtig sind, um die Situation zu verstehen: Der meiste Speicher, den Ihr Programm verwendet, ist der JVM-Heap . Der Heapspeicher hat eine anfängliche Größe, wenn das Programm gestartet wird. Manchmal fragt die JVM das Betriebssystem nach mehr Speicher und erhöht die Größe des Heapspeichers. Die JVM führt auch eine Speicherbereinigung durch, wodurch Speicherplatz im Heap freigegeben wird.

Wenn die Größe des verwendeten Heapspeichers abnimmt, wird der Speicher nicht unbedingt von der JVM freigegeben. Die Oracle-JVM tut dies nur ungern. Wenn Ihr Programm zum Beispiel 500 MB RAM beim Start verwendet, können Sie nach der Garbage Collection für die meisten Ausführungen nur 100 MB verwenden. Sie können nicht davon ausgehen, dass die zusätzlichen 400 MB an Ihr Betriebssystem zurückgegeben werden.

Darüber hinaus zeigen Werkzeuge wie der Windows-Task-Manager (und ich nehme an, dass% code% von Unix) die Größe des gesamten Speichers, der der JVM zugewiesen ist, unabhängig davon, ob dieser Speicher tatsächlich verwendet wird oder nicht . Mit Tools wie jvisualvm können Sie genau sehen, wie der Speicher in Ihrem Java-Programm verwendet wird und insbesondere, wie viel Heap Sie tatsächlich sind Verwenden vs. wie viel ist zugeordnet.

Vor diesem Hintergrund habe ich Ihr Programm in den folgenden Szenarien getestet. Beachten Sie, dass dies von vielen Faktoren abhängt, einschließlich der von Ihnen verwendeten JVM, ihrer Version und wahrscheinlich auch Ihres Betriebssystems.

  • Standard-Java (SE) gegen Frühling.
  • Garbage Collection (GC) vs keine (NOGC) (Ich nannte den Garbage Collector von jvisualvm).
  • Minimale Heap-Größe, die für die JVM definiert wurde (mit -Xmx8M). Dies weist die JVM an, beim Start nur 8 MB zuzuweisen. Der Standardwert auf meinem System ist 256 MB.

Für jeden Fall melde ich die zugewiesene Heap-Größe und die verwendete Heap-Größe. Hier sind meine Ergebnisse:

  • SE, NOGC, 256M: 270 MB zugewiesen, 30 MB verwendet
  • Spring, NOGC, 256M: 270 MB zugewiesen, 30 MB verwendet

Diese Ergebnisse sind identisch, daher nehme ich an, dass Sie in Ihrer Frage bereits eine andere Umgebung hatten als ich.

  • SE, GC, 256M: 270 MB zugewiesen, 9 MB verwendet

Die Verwendung des GC reduziert die Heap-Nutzung, aber wir haben immer noch den gleichen belegten Speicher

  • SE, NOGC, 8M: 9 MB zugewiesen, & lt; 5 MB verwendet
  • Spring, NOGC, 8M: 20 MB zugewiesen, & lt; 5 MB verwendet

Dies ist das wichtigste Ergebnis: Es wird mehr Speicher zugewiesen, da Spring wahrscheinlich während des Startvorgangs mehr benötigt.

Schlussfolgerungen:

  • Wenn Sie versuchen, die Heap-Nutzung zu reduzieren, sollte die Verwendung von Spring kein großes Problem darstellen. Der Aufwand ist nicht riesig.
  • Wenn Sie versuchen, den zugewiesenen Speicher zu reduzieren, ist der Preis für die Verwendung von Spring in diesem Experiment steiler. Sie können Ihre JVM jedoch weiterhin so konfigurieren, dass mehr Speicher als standardmäßig freigegeben wird. Ich weiß nicht viel darüber, aber jvm Optionen wie ps könnten ein Anfang sein (mehr hier Ссылка )
ARRG 05.03.2014, 16:17
quelle

Tags und Links