Beim Extrahieren eines Heapdumps habe ich festgestellt, dass viele Objekte auf die Fertigstellung warten, die meisten davon sind Instanzen aus Bibliotheken wie jdbc-Verbindungen und so weiter.java.lang.ref.Finalizer OutOfMemory Nach Speichererhöhung
Wissen, dass diese Instanzen in der Warteschlange grundsätzlich Klassen sind, die implementiert finalize()
, warum würden sie einfach nicht finalisiert werden?
Vor ein paar Tagen hob ich die Erinnerung an solche Instanz. Anfangs hatte es 1 GB mit neuer Generation auf 256 MB eingestellt (-Xmx1g -XX:NewSize=256m -XX:MaxNewSize=256m
). Als wir einige starke Caching-Funktionalitäten hinzugefügt haben, haben wir den Speicher, der dieser Instanz zugewiesen wurde, auf 3 GB erhöht (-Xmx3G -XX:NewSize=512m -XX:MaxNewSize=512m
). Von diesem Moment an beginnen wir einige Erinnerungen zu sehen. Ich habe eine Menge java.lang.ref.Finalizer und Objekte gefunden, die auf Finalisierung warten.
Wie könnte dies miteinander verwandt sein? Kann es sogar verwandt sein?
Sie haben Recht, ich aktualisierte die Einheiten auf meine Frage –
was ich bin ein bisschen neugierig ist, wie das sein würde, warum taucht dieses Problem mit dem 'finalize()' nur nach der Speicheränderung auf, würde dies mit der Ration verbunden sein, die ich zwischen der neuen Generation und der alten Generation verwendet habe? –
@FranciscoSpaeth Die Anwendung, die die zu finalisierenden Ressourcen generiert, ist langsamer, wenn weniger Arbeitsspeicher zur Verfügung steht. Es könnte multi-threaded sein. Wenn Sie mehr Speicher bereitstellen, können mehr Ressourcen erstellt werden, die bereinigt werden müssen. Der Finalizer mit einem einzelnen Thread kann jedoch nicht mithalten, sodass er zum Engpass wird. Kurz gesagt, wenn Sie ein Bit schneller machen, verschieben Sie das Leistungsproblem woanders und brechen es möglicherweise dabei. –