Hohe Arbeitsspeicher-Auslastung bei der Verwendung von Hibernate
Code ich eine server-seitige Anwendung, die mit java laufen auf linux-server.
Ich benutze hibernate an open session in Datenbank, den Einsatz von nativen sql-Abfragen und immer in der Nähe dieser session try, catch, finally.
Meine server query DB über hibernate mit sehr hoher Frequenz.
Ich bereits definieren MaxHeapSize denn es ist 3000M, aber es in der Regel verwenden 2.7 GB an RAM, kann es zu verringern, aber langsamer als der Anstieg. Irgendwann wird es wachsen bis zu 3,6 GB Speicherverbrauch, mehr als mein MaxHeapSize definieren, die beim starten.
Wenn der Speicher verwendet wird, ist 3.6 GB, ich versuche es dump mit -Befehl jmap und bekam einen heapdump mit einer Größe von 1,3 GB nur.
Im mit eclipse MAT zu analysieren, hier ist der dominator-Baum von MAT
Ich denke, dass hibernate das problem ist, ich habe so viele org.apache.Unterhaus.Sammlungen.Karte.AbstractReferenceMap$ReferenceEntry wie diese. Es ist vielleicht nicht das entsorgen von Müll-Sammlung oder können, aber langsam.
Wie kann ich es beheben?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie 250k Einträge in der IN der query-Liste. Sogar eine native Abfrage wird die Datenbank in die Knie zu zwingen. Oracle-schränkt die Abfrage IN listing 1000 aus performance-Gründen, so sollten Sie das gleiche tun.
Gibt es mehr RAM ist nicht das problem zu lösen, müssen Sie beschränken Sie Ihre Auswahl/updates zu Chargen von maximal 1000 Einträge, indem Sie mit Paginierung.
Streaming ist eine option auch, aber für so ein großes ResultSet, keyset pagination ist in der Regel die beste option.
Wenn Sie können alles tun, die Verarbeitung in der Datenbank, dann werden Sie nicht haben, sich zu bewegen 250k Datensätze aus der DB in die app. Es gibt einen sehr guten Grund, warum viele RDBMS bieten erweiterte prozeduralen Sprachen (z.B. PL/SQL, T-SQL).
Beachten Sie, dass, obwohl die Anzahl der Objekt in der queryPlanCache können konfiguriert und begrenzt werden, ist es wohl nicht normal ist nach so viel.
In unserem Fall waren wir schreiben von Abfragen in hql ähnlich wie diese:
Dies führte zu N verschiedene Abfragen gehen, um die queryPlanCache. Wenn wir dies geändert Abfrage:
die Größe der queryPlanCache wurde drastisch reduziert, von 100 MB auf fast 0. Diese zweite Abfrage wird übersetzt in eine einzige preparedStament resultierenden nur ein Objekt im cache.
Danke
Vlad Mihalcea
mit Ihrem link zu Hibernate Problem, das ist Fehler, die auf Ruhezustand, das Update auf version 3.6. Ich habe gerade update mein hibernate-version 3.3.2 auf die version 3.6.10, verwenden Sie den Standardwert von "hibernate.Abfrage.plan_cache_max_soft_references" (2048), "hibernate.Abfrage.plan_cache_max_strong_references" (128) und mein problem ist Weg. Nicht mehr hohe Speicherauslastung.