Das Wachstum in den alten gen Speichernutzung bedeutet immer ein memory leak in java?
Wir haben mehrere VMs, die laufen Daten-service in der Produktion, Restful HTTP-client sendet Anfragen an data service, der laden ist sowas von schwer (500 Anfragen pro Sekunde pro host im Allgemeinen) und die Last immer ausgewogen auf jeder VM. Wir haben die gleiche Konfiguration auf allen Rechnern (2 CPUs), - Xms2048m -Xmx4096m -XX:MaxPermSize=192m -XX:NewSize=512m -XX:MaxNewSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError)
Vor zwei Tagen sahen wir die alten gen in die heap-Verwendung zu wachsen anfangen, auf 5 von den VMs (300 MB pro Tag), der alten gen in die heap-Verwendung auf anderen bleiben die gleichen (rund 80 MB), versuchen wir die Ursache zu identifizieren, darf ich Fragen, ob dies ist ein memory-leak-Problem oder einfach nur eine normale situation? Hat das Wachstum in den alten gen Speichernutzung bedeutet immer ein memory leak in java?
Dank.
Update: Wir haben gerade neu gestartet, die 5 hosts gestern, alten gen in die heap-Verwendung, die auf alle ging wieder normal, wie die anderen, jedoch, nach dem peak-load-wir hatten an diesem morgen, der alten gen in die heap-Verwendung, die auf einer von Ihnen begann wieder zu wachsen...
Java nur GCs-Speicher that is not referenced. Wenn Sie erstellen eine for-Schleife, die hält das hinzufügen neuer Objekte zu einer Liste, die Sie laufen aus dem Speicher, bevor Sie sagen können, blueberry pie.
Es ist nicht unmöglich für java, um einen Speicherverlust, aber es müsste ein Fehler in der GC selbst. Ich glaube, es gibt Fälle wie,, don ' T zitieren Sie mich, wenn.
Ich bin mir nicht sicher, ob ein memory leak ist wirklich die gleiche wie die einfache Verwendung bis alle Ihre Speicher.
Es ist durchaus möglich, ein memory leak in Java -- zum Beispiel, indem mehr und mehr Daten in einer
HashMap
, dass Sie als cache verwendet wird, ohne Räumung / Ablauf-PolitikInformationsquelleAutor zhengyu | 2014-04-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hat das Wachstum in den alten gen Speichernutzung bedeutet immer ein memory leak in java?
Nicht unbedingt.
Den concurrent-mark-sweep-garbage-collector nicht kompakt der alten gen während der Sammlung. So unter ausreichend Speicher zu laden, ist es möglich, eine große Menge an Fragmentierung, der es unmöglich macht, zu reklamieren, genug Speicher zu ermöglichen Förderung der pragmatisierte Objekte in die old gen Raum.
Versuchen Sie, auf diese params und sehen, was Los ist:
Look für die Förderung der Misserfolge und häufige vollständige GC fegt, die nicht kostenlos eine Menge an Speicher.
Wenn Sie mit Java 7 oder höher, können Sie versuchen Sie die Umstellung auf die G1-collector (-XX:+UseG1GC anstelle von-XX:+UseConcMarkSweepGC). Dies ist eine compacting collector vermeidet einige der oben genannten Fragen.
Wenn du bist immer noch in Probleme laufen, danach, dann würd ich schauen auf Ihren code, um zu sehen, ob etwas hängenden auf Objekt-Referenzen, wenn es nicht sollte.
Edit: da dies geschieht auf einigen hosts und der andere nicht, würde ich neigen zu einem code-Problem, vielleicht im Zusammenhang zu unerwarteten Benutzereingaben, da es tritt nur sporadisch auf.
InformationsquelleAutor spudone
Es klingt wie das, was Sie beschreiben, ist ein Speicher-Leck. Weil für mich ein Speicherleck ist, wenn dein Speicher erhöht sich in der Zeit ohne guten Grund oder ohne Entwickler zu verstehen, warum. Was wohl bedeutet, dass einige Daten, die Sie eigentlich nicht brauchen, ist immer noch im Speicher gehalten, wahrscheinlich als ein Ergebnis eines Fehlers.
Ich würde erwägen, ein guter profiler zu bekommen, um die Ursache zu finden. Es ist wahrscheinlich am einfachsten. Ich weiß nicht, ob ich das darf-name-Produkte hier aber JProfiler rettete mein team in mehreren Projekten arbeitete ich an.
InformationsquelleAutor Natan Cox