2010-01-11 3 views
4

Juste pour clarifier un point que j'ai vu ici indirectement répondu:Meilleur GC pour Java démon

est le meilleur GC à utiliser sur plusieurs CPU/multi-core machine qui exécute l'application la plupart du temps, est ConcurrentMarkSweeper (aka - XX: + UseConcMarkSweepGC)?

En outre, il y a quelque chose appelé G1, une idée quand il deviendra disponible pour Java6?

EDIT: J'utilise Sun Java VM, 1.6.0_16-b01. J'ai une application en temps réel (aussi proche que possible du temps réel en Java), et je veux naturellement que les balayages GC soient aussi courts que possible. Il y a beaucoup de puissance CPU (ce que ConcMarkSweep semble exiger).

Merci.

+1

g1 est en java 6 depuis u14 ou quelque chose (mais vous devez l'allumer et c'est une pré-version et pas encore la qualité de production). Ce qui est le mieux dépend généralement de votre application et de ses besoins, mais je suis sûr que vous obtiendrez une vraie réponse expliquant cela (j'écris cela d'une main tout en tenant mon enfant d'un jour avec l'autre). – Fredrik

+0

Veuillez modifier votre question pour indiquer QUELLE JVM vous utilisez. Ceci dépend du vendeur. –

+0

Fredrik, félicitations pour le nouveau-né! – SyBer

Répondre

8

Cela dépend du type de tolérance de l'application pour les pauses GC. ConcurrentMarkSweep est le meilleur choix pour réduire la taille des pauses GC et donc la latence pendant que le GC Parellel atteint le meilleur débit au détriment des pauses GC plus longues.

G1 est actuellement une fonctionnalité expérimentale. Je pense qu'il ne sera pas disponible avant la sortie de Java7.

Je vous recommande de jeter un oeil à cette page: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html

Il contient beaucoup d'informations sur les algorithmes de GC et le comportement. Il y a une section avec des conseils pour sélectionner le meilleur GC pour votre application: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#available_collectors.selecting

+0

Merci pour le lien. Donc, pour résumer: * utilisation maximale du processeur - GC parallèle (la valeur par défaut AFAIK) * La réactivité maximale - ConcMarkSweep correcte? – SyBer

+0

Je pense que les deux sont en mesure de maximiser l'utilisation de votre processeur. Parallel vous donnera le débit maximum (par exemple, les transactions par seconde). Comme vous le dites ConcMarkSweep vous donnera une réactivité maximale. – Aaron

-1

Nous utilisons -server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log

fonctionne comme un charme. Voir aussi What are the best garbage collection settings for client side?

+5

ressemble plus à plus long, pas mieux. –