2012-02-23 12 views
6

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.

+0

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

+0

È possibile considerare il pool di oggetti. Quello sarebbe un modo per ridurre la quantità di GC che sta accadendo. –

+1

@ Garantito: si eseguono JVM indipendenti e quando una JVM esegue un GC completo, viene interessata ogni singola JVM? È questo che stai descrivendo? – TacticalCoder

risposta

0

La latenza del GC è uno dei problemi inerenti ai linguaggi raccolti con garbage come Java. Questo è uno dei motivi per cui sistemi ad alta velocità come i sistemi di compravendita di azioni sono scritti in C++ e non in Java o C#. 100ms suona bene per una grande operazione di GC.

+2

Come risponde la domanda? Tutto ciò dice che sì, ciò che l'OP descritto sta effettivamente accadendo; lo sappiamo già. – millimoose

+0

Credo che la domanda riguardasse più processi * * in fase di stallo allo stesso tempo. – delnan

+0

@Mike Thomsen: algoritmi di trading ad alta frequenza scritti in C++? Pfft ... Questo è così bello! Ora è direttamente Hardware Description Language/FPGA! ; – TacticalCoder

0

Se si utilizza uno strumento come JConsole per visualizzare l'attività di memoria, si vedrà che la garbage collection è generalmente un'attività pesante. Potresti voler fare un po 'di profilazione per vedere se ci sono altri colli di bottiglia coinvolti. Inoltre, la maggior parte degli algoritmi di garbage collection ha a disposizione diverse opzioni di configurazione.

Infine, ricordo una situazione che abbiamo affrontato un po 'di tempo fa ci ha portato a scoprire che avere le impostazioni di memoria min e max più vicine era utile (almeno nel nostro caso). Ha causato la raccolta dei rifiuti più frequente, ma non erano così invadenti.

Spero che questo aiuti.

3

quando si utilizza -Xincgc, di cui al presente sun documentation

La concomitante partire collettore pausa: questo collettore è utilizzato se la -Xincgc ™ o -XX: + UseConcMarkSweepGC viene passato sulla linea di comando. Il collector concorrente viene utilizzato per raccogliere la generazione di tenured e fa la maggior parte della raccolta contemporaneamente all'esecuzione dell'applicazione. L'applicazione viene messa in pausa per brevi periodi durante la raccolta.

Potrebbe essere necessario prendere in considerazione altre alternative come Raccoglitore di dati. Sopra la documentazione ha una buona descrizione su quando, quale raccoglitore sarà utile.

+0

Se leggo bene questa documentazione, il raccoglitore di throughput è ancora meno adatto per un requisito di bassa pausa - TUTTI i collettori si fermeranno a volte, differiscono solo per quanto a lungo sarà la pausa e quanto del tempo totale di esecuzione sarà speso in mette in pausa. AFAIK, il raccoglitore della produttività avrà pause individuali più lunghe, ma alla fine richiederanno meno tempo. Il collector incrementale avrà pause più brevi che aumenteranno il tempo trascorso in stallo. – millimoose

+0

Inoltre, la guida a cui è collegato è per Java 5.0. Quali garbage collector sono disponibili/selezionati di default è una cosa che cambia tra le versioni di HotSpot VM, quindi dovresti sicuramente usare la documentazione più attuale pertinente quando ne parli. – millimoose

3

Java v 1.6 dovrebbe essere intelligente e capire quale tipo di GC è il migliore.

Mi raccomando la lettura di questo: Garbage collection in Java 6

Sommario: provare uno di questi (ma non entrambi):

  • -XX: + UseParallelGC
  • -XX: + ExplicitGCInvokesConcurren
2

Il problema che si verifica è una "raccolta completa di rifiuti", anche nota come "Stop the world GC". Quando ciò si verifica, l'app java smette di funzionare. Controllare questo thread per alcune indicazioni:

Tuning garbage collections for low latency

+0

In base ai log del GC, non si verificano raccolte complete. – Guaranteed