Eseguire un codice molto semplice per provare a vedere come funzionano i garbage collector.Comportamento GC inatteso: alcuni dati vanno sempre nella generazione di possesso
String a = null;
while (true) {
a = new String(" no... ");
}
Sto usando ParallelGC. Ho stampato i risultati GC e qui sono i primi (minori) GC.
[GC [PSYoungGen: 16448K->1616K(19136K)] 16448K->1624K(62848K), 0.0022134 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
youngGen scese da 14880K
tuttavia fullHeap è sceso di appena 14872K
Questo significa 8k si è trasferito alla generazione mandato? La mia comprensione è che il GC potrebbe essere stato definito come un istanza della classe 'a' che deve essere stato contrassegnato come vivo e spostato alla generazione di possesso. Questa comprensione è corretta? Inoltre, è questo "Floating Garbage"? Durante il periodo di validità la generazione di possesso viene riempita e viene richiesto un GG completo, tuttavia richiede un po 'di tempo.
Inoltre, in questo caso particolare, non si raccoglie l'intera raccolta minore e, idealmente, nulla entra nella generazione di possesso? Tutti questi sono oggetti di breve durata.
grazie. se gli oggetti stringa non entrano mai in Old Generation, perché l'heap (lentamente ma costantemente) si riempie dopo di che è richiesto un GC completo. Cosa pensi stia riempiendo di vecchio gen? –
Ci sono almeno 20 altri thread in esecuzione nella JVM, non solo il thread "Main", quindi è abbastanza logico che alcuni oggetti vengano creati. Esempio: i thread del timer o i thread del GC stesso. La cosa importante è che dopo un GC completo, recuperi molta memoria. –
@ N.M. Come un punto di vista, nota che Pierre ha detto che gli oggetti Stringhe nel tuo esempio non entreranno nel vecchio gen, non che gli oggetti stringa in generale non entrano mai in vecchio. – monkjack