Sto eseguendo un server applicazioni su Linux a 64 bit con 8 core CPU e 6 GB di memoria.Ottimizzazione JVM (GC) per applicazione server ad alta risposta
Il server deve essere altamente reattivo.
Dopo alcune ispezioni ho scoperto che l'applicazione in esecuzione sul server crea una quantità enorme di oggetti di breve durata e ha solo circa 200 ~ 400 MB di oggetti di lunga durata (purché non vi siano perdite di memoria)
Dopo aver letto http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html uso queste opzioni JVM
-server -Xms2g -Xmx2g -XX:MaxPermSize=256m -XX:NewRatio=1 -XX:+UseConcMarkSweepGC
risultati: GC minore assume 0.01 ~ 0,02 sec, il principale GC prende 1 ~ 3 sec GC minore accade costantemente.
Come posso migliorare ulteriormente o ottimizzare la JVM?
dimensioni heap maggiori? ma ci vorrà più tempo per GC?
più grandi NewSize e MaxNewSize (per le giovani generazioni)?
altro collettore? GC parallelo?
è una buona idea lasciare che il GC principale si svolga più spesso? e come?
Vorrei sottolineare che l'Azul Zing jvm in molti casi "è" più performante. Fanno GC dietro le quinte mentre l'app è in esecuzione. Roba molto interessante Di nuovo, non è gratuito, ma per coloro che desiderano eliminare la necessità di sintonizzare una JVM, questo può farlo. Penso che lo chiamino il loro collezionista C4 (concurrent, continuous, compaction, collector?). Un recente benchmark di Mike McCandless lo ha testato su Apache Lucene/Solr contro CMS. Grandi risultati in termini di scalabilità: http://blog.mikemccandless.com/2012/07/lucene-index-in-ram-with-azuls-zing-jvm.html L'ho seguito in quanto cambia il gioco –