Da ein neu erstelltes Objekt einer neuen Generation zugeordnet wird. Ist es möglich, dass ein neu erstelltes Objekt direkt einer alten oder dauerhaften Generation zugeordnet wird? Wenn ja, auf welcher Grundlage?
Antwort
Zu viele Anzeigen?Siehe " Häufig gestellte Fragen zur Garbage Collection in der HotspotTM JavaTM Virtual Machine ":
Werden Objekte jemals direkt der alten Generation zugewiesen?
In 1.4.1 gibt es zwei Situationen, in denen die Zuteilung direkt in die alte Generation.
Wenn eine Zuteilung in der jungen Generation scheitert großes Array ist, das keine Referenzen auf Objekte enthält, kann es direkt der alten Generation zugeordnet werden. In einigen ausgewählten Fällen, In einigen ausgewählten Fällen sollte diese Strategie eine Sammlung der jungen Generation durch Zuweisung aus der alten Generation zu vermeiden.
Es gibt ein Flag (verfügbar in 1.4.2 und später) l-XX:PretenureSizeThreshold=, das gesetzt werden kann, um die Größe der Zuteilungen in der jungen Generation zu begrenzen. Jede Zuweisung, die größer ist als dieser Wert wird in der jungen Generation nicht versucht, und wird daher aus der alten Generation zugewiesen.
Die Schwellengröße für 1) beträgt 64k Wörter. Die Standardgröße für PretenureSizeThreshold ist 0, was bedeutet, dass jede beliebige Größe zugewiesen werden kann in der jungen Generation zugewiesen werden kann.
In 1.4.2 Fall 1) wird die 64k-Wort-Schwelle inkrementellen Kollektor (-Xincgc). Für den Standardkollektor und den Concurrent Collector (-XX:+UseConcMarkSweepGC) wurde der Schwellenwert so geändert, dass ein Versuch, die nur dann erfolgt, wenn die Größe des gesamten junge Generation (verfügbarer Platz, wenn sie leer ist). Es wurde beobachtet dass es Fälle gab, in denen die 1.4.1-Strategie für den Standard Collector und Concurrent Collector zu vollen Sammlungen führten führte (es wurden keine Sammlungen der jungen Generation durchgeführt). Wir waren der Ansicht, dass schlimm genug, um den Schwellenwert anzuheben.