Stiamo eseguendo più istanze di un processo server su una finestra di Linux. La scatola ha 8 core e 16 GB di RAM. Sto avviando ogni processo con l'opzione -Xincgc, usando Java 1.6.Java Garbage Collection blocca tutti i processi Java
Disponiamo di vari timer per tutta l'applicazione che tracciano il tempo necessario per completare varie attività. Quando si verifica la garbage collection, noto che ogni processo java sul box mostra che qualsiasi attività in esecuzione al momento era lenta.
Non è in fase di stallo per un lungo periodo, forse 100-300 ms o giù di lì, ma la latenza è un fattore enorme per questo. Inoltre, non si ferma continuamente, solo periodicamente.
Quando si verifica la raccolta dei dati inutili, impedisce a qualsiasi processo Java di ottenere in qualsiasi momento? Se è così, c'è un modo per aggirare questo? Dovrei usare diverse opzioni GC?
UPDATE:
Giusto per essere chiari, io non sono preoccupato per uno stallo processo, mentre GC sta accadendo. Posso modificare le impostazioni o ottimizzare per quel caso. Mi sto solo chiedendo perché OGNI processo Java in esecuzione sembra bloccarsi allo stesso tempo quando pensavo che fossero più o meno indipendenti.
GC non dovrebbe davvero arrestarsi tutti i processi. Inoltre, è necessario leggere la [Guida alla regolazione GC] (http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html). Il garbage collector predefinito per Java 6 dovrebbe essere il GC parallelo, che è ottimizzato per il throughput, non per il tempo di pausa. Il collector concorrente potrebbe essere più adatto. – millimoose
È possibile considerare il pool di oggetti. Quello sarebbe un modo per ridurre la quantità di GC che sta accadendo. –
@ Garantito: si eseguono JVM indipendenti e quando una JVM esegue un GC completo, viene interessata ogni singola JVM? È questo che stai descrivendo? – TacticalCoder