Mi chiedo quali sono le situazioni esatte che innescano la Full Garbage Collection in Java.
Gli ovvi sono:
Che dire degli altri casi che causano il pieno gc? In particolar modo:
Sono in esecuzione Sun Java 1.6 e utilizzo di Concurrent Mark-Sweep e ParNew per la nuova generazione.
Ho osservato una situazione in più che innesca un GC completo in Java Hotspot VM 1.6 a 64 bit su Ubuntu, usando il Concurrent Mark-Sweep:
Se -XX: il valore PermSize non è uguale a -XX: MaxPermSize (ad esempio è più piccolo), un GC completo occasionale si verifica quando java deve espandere PermGen (anche se non è necessario allocare più memoria di MaxPermSize). Quindi impostare -XX: PermSize e -XX: MaxPermSize per essere lo stesso sembra una buona idea.
Questo dipende molto dalle opzioni di jvm e dalla jvm che usi.
Per questo motivo, ti consiglio di guardare il libro “Java Performance” di John and Hunt.