So reduzieren Sie den Frühling Speicherbedarf
Möchte ich Sie Fragen, WIE (oder WENN) möglich ist, zu reduzieren, Spring framework, RAM footprint.
Habe ich eine einfache helloworld-app für den Nachweis der Ausgabe. Es gibt nur zwei Klassen und context.xml Datei:
Main
- Klasse mit main-MethodeTest
- Klasse für die Simulation einige "arbeiten" (printig Hallo, in endlos-Schleife)
context.xml
enthält nur diese:
<context:component-scan base-package="mypackage" />
Test-Klasse enthält nur metod genannt init
nennen, der nach Konstruktion:
@Component
public class Test{
@PostConstruct
public void init() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
while (true) {
System.out.println("Hello " + Thread.currentThread().getName());
Thread.sleep(500);
}
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
});
t.start();
}
}
Bereitete ich zwei Szenarien und beide main
- Methode enthält nur eine Zeile.
Im ersten Szenario main-Methode tut: (new Test()).init();
App funktioniert ohne Feder und verbraucht nur ca. 8MB RAM.
Im zweiten Szenario main-Methode enthält die folgenden: new ClassPathXmlApplicationContext(new String[]{"spring/context.xml"});
So ist die app initialisiert wird, bei Spring-container und verbraucht ca. 45MB RAM !
Gibt es eine Möglichkeit, wie zu reduzieren (im besten Fall vollständig loszuwerden) diesem zusätzlichen Speicher ? So weit ich war nicht in der Lage zu finden keine passende Lösung.
Mir nichts aus, wenn es ist der zusätzliche Speicherbedarf auf Start - das ist völlig in Ordnung, aber danach muss ich unsere app zu reduzieren.
(Die Geschichte, die hinter dieser Frage ist ein bisschen komplizierter, aber das ist für mich jetzt der Kern des Problems.)
Danke
- wie hast du das Maß der Speicher Verbrauch?
- Wenn Sie möchten, verwenden Frühling als DI-container, würde ich dir empfehlen, zu versuchen, etwas leichter wie Guice oder Dolch.
- Dies ist nur eine Idee, (ich weiß nicht, ob es funktioniert): ich würde erwarten, dass Sie Verringerung des Speicherbedarfs (PermGen), wenn Sie nutzen spring, java-basierte Konfiguration anstelle der xml-Konfiguration, denn ich erwarte, dass der Frühling dann nicht das laden der xml-libaries, die für das Lesen der Datei.
- Ich bin mit dem windows task-manager, weil die eigentlich alocated Speicher ist der einzige Speicher, der Fragen an mich. Und für alles andere verwende ich JProfiler
- thx für den Tipp, ich werde es einmal versuchen
- nur mithilfe der annotation-config speichert nur 2M.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst ein paar Dinge, die Sie vielleicht schon wissen, aber wichtig sind um die situation zu verstehen: die meisten der Speicher, die Ihr Programm verwendet wird die JVM-heap -. Der Haufen hat eine erste Größe, wenn Ihr Programm beginnt mit der Ausführung. Manchmal ist die JVM fragt das Betriebssystem, mehr Speicher und erhöhen Sie die Größe des Heaps. Die JVM wird auch garbage collection durchführen, um Speicherplatz im heap.
, Wenn der verwendete heap-Größe verringert wird, ist der Speicher nicht unbedingt veröffentlicht durch die JVM. Die oracle-JVM nur ungern zu tun. Zum Beispiel, wenn Sie Ihr Programm nutzt 500 MB ram beim Start, dann nach der garbage collection verwendet nur 100 MB für die meisten seiner Ausführung, Sie können nicht davon ausgehen, das weitere 400 MB gegeben werden zurück zu Ihrem OS.
Zudem Werkzeuge wie windows task-manager (und ich gehe davon aus unix -
ps
) zeigt die Größe aller Speicher, der reserviert wird, um den JVM-unabhängig davon, ob dieser Speicher tatsächlich verwendet wird oder nicht. Tools wie jvisualvm lassen Sie genau sehen, wie der Speicher verwendet wird, in Ihre java-Programm, insbesondere, welche Menge heap man eigentlich mit vs. wie viel zugeordnet ist.Mit diesem im Verstand, die ich getestet habe, Ihr Programm in den folgenden Szenarien. Beachten Sie, dass diese hängt von vielen Faktoren ab, darunter die JVM, die Sie benutzen, Ihre version, und wahrscheinlich ist dein OS auch.
Für jeden Fall Berichte ich in den zugewiesenen heap-Größe und der verwendeten heap-Größe. Hier sind meine Ergebnisse:
Diese Ergebnisse sind identisch, so dass Ihre Frage ich nehme an, Sie hatten bereits ein anderes Umfeld als ich.
Mithilfe der GC reduziert die heap-Verwendung, aber wir haben immer noch den gleichen Speicher zugewiesen
Dies ist das wichtigste Ergebnis: mehr Arbeitsspeicher zugewiesen wird, weil die Feder muss wahrscheinlich mehr an einem gewissen Punkt während des Starts.
Schlussfolgerungen:
-XX:MaxHeapFreeRatio=70
könnte der Anfang sein (mehr hier http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#PerformanceTuning )