Che cosa innesca una garbage collection completa in Java?

Mi chiedo quali sono le situazioni esatte che innescano la Full Garbage Collection in Java.

Gli ovvi sono:

  • A corto di vecchia generazione
  • A corto di perm gen
  • Chiamando System.gc ()

Che dire degli altri casi che causano il pieno gc? In particolar modo:

  • Non avere abbastanza spazio libero in Survivor Space per copiare oggetti dall’Eden.
  • Le raccolte minori non sono in grado di far fronte al tasso di allocazione di nuovi oggetti (non so come se).

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.