2008-09-17 5 views
1

Je sais qu'il n'y a pas de "bonne" taille de tas, mais quelle taille de tas utilisez-vous dans vos applications (type d'application, jdk, os)?Quelle taille de tas préférez-vous?

Les options JVM (initiales/minimales) et -Xmx (maximum) permettent de contrôler la taille du tas. Quels paramètres ont du sens dans quelles circonstances? Quand les paramètres par défaut sont-ils appropriés?

+1

Quel type de réponse attendez-vous? Dois-je répondre, que je cours mon Java avec '-Xmx512'? Qu'attendez-vous? –

+0

Oui, mais vous devez également ajouter des informations sur votre application, jdk et os. – trunkc

Répondre

1

Typiquement, j'essaie de ne pas utiliser de tas de plus de 1 Go. Cela vous coûtera pour les principales collectes de déchets.

Parfois, il est préférable de diviser votre application en plusieurs JVM sur la même machine et non sur les grandes tailles de tas.

La collection majeure avec une taille importante de segment peut prendre> 10 minutes (sur des applications GC non optimisées).

+1

Quelle taille doit avoir le tas pour bloquer la JVM pendant 10 minutes? Quelle JVM utilisiez-vous? Quels paramètres GC utilisiez-vous? –

+0

Je n'ai eu aucun problème avec un tas de 1,3 Go pour Websphere 5.1 (IBM JDK1.4, Windows, pas de paramètres GC spéciaux). – trunkc

2

En fait, j'ai toujours trouvé très étrange que Java limite la taille du tas. Une application native peut généralement utiliser autant de segments qu'elle le souhaite, jusqu'à ce qu'elle ne dispose plus d'espace d'adressage virtuel. La seule raison de limiter le tas dans Java semble être le garbage collector, qui a une certaine "paresse" et ne peut pas ramasser des objets, à moins qu'il y ait une nécessité de le faire. Cela signifie que si vous choisissez le tas trop grand, votre application utilise constamment plus de mémoire que ce qui est vraiment nécessaire.

Cependant, Sun a beaucoup amélioré le GC au fil des ans et pour émuler le comportement d'une application C native, je définirais la taille initiale du tas à 32 Mo (pour les petits programmes) ou 64 Mo (pour les plus gros) et le maximum à quelque chose entre 1-2 GB. Si votre application nécessite vraiment plus de 1 Go de mémoire, elle est probablement cassée (sauf si vous manipulez des objets de données aussi volumineux), mais je ne vois pas pourquoi votre application devrait être détruite, juste parce qu'elle dépasse une certaine taille de tas.

Bien sûr, cela fait référence aux PC normaux. Si vous créez du code Java pour les téléphones mobiles ou d'autres périphériques limités, vous devez probablement adopter la taille de segment de mémoire initiale et maximale aux limites de ce périphérique.

1

Ceci dépend entièrement de votre application et des limitations matérielles que vous pourriez avoir. Il n'y a pas de taille unique. Jmap peut être utilisé pour voir quel tas vous utilisez réellement et constitue un bon point de départ pour le dimensionnement correct du tas.

+0

"Il n'y a pas de taille unique." Je n'ai pas demandé la taille unique. – trunkc

5

Vous devez essayer votre application et voir comment elle fonctionne. par exemple, je courais toujours IDEA hors de la boîte jusqu'à ce que j'ai ce nouveau travail où je travaille sur cet énorme projet monolithique. IDEA fonctionnait très lentement et jetait régulièrement des erreurs de mémoire lors de la compilation du projet complet.

La première chose que j'ai faite est de monter le tas à 1 gig. Cela s'est débarrassé des problèmes de mémoire, mais il était encore lent. J'ai également remarqué que IDEA gelait régulièrement pendant 10 secondes, après quoi la mémoire utilisée était coupée de moitié seulement pour redémarrer et cela déclenchait l'idée de la collecte des ordures. Je l'utilise maintenant avec -Xms512m, -Xmx768m mais, j'ai aussi ajouté -Xincgc, pour activer la récupération incrémentielle

Par conséquent, j'ai récupéré mon ancienne IDEA: elle fonctionne en douceur, ne gèle plus et n'utilise jamais plus de 600m de tas.

Pour votre application, vous devez utiliser une approche similaire. essayez de déterminer l'utilisation typique de la mémoire et ajustez votre tas pour que l'application fonctionne bien dans ces conditions. Mais laissez également les utilisateurs avancés régler le paramètre pour gérer les charges de données hors de l'ordinaire.

+0

Pour moi IntelliJ 7.0.4 (JDK, Windows XP, "grands projets") fonctionne bien avec -Xms64m -Xmx364m. J'ai également essayé "la collecte incrémentielle des ordures", mais avec ces options, l'idée était moins réactive. – trunkc

3

Cela dépend du type d'application.Une application de bureau est très différente d'une application Web. Un serveur d'applications est très différent d'une application autonome.

Cela dépend également de la machine virtuelle Java que vous utilisez. JDK5 et plus tard 6 incluent des améliorations qui aident à comprendre comment régler votre application.

La taille du tas est importante, mais il est également important de savoir comment il joue avec le garbage collector.

JDK1.4 Garbage Collector Tuning

JDK5 Garbage Collector Tuning

JDK6 Garbage Collector Tuning

+0

Alors, quelles sont vos valeurs? – trunkc

1

Vous devez passer un certain temps dans JConsole ou visualvm pour obtenir une image claire sur ce que le plateau utilisation de la mémoire est. Attendez que tout soit stable et vous voyez la courbe en dents de scie caractéristique de l'utilisation de la mémoire de tas. Les pics devraient être votre tas de 70-80%, selon le garbage collector que vous utilisez.

La plupart des garbage collector déclenchent des GC complets lorsque l'utilisation du tas atteint un certain pourcentage. Ce pourcentage est compris entre 60% et 80% du maximum, selon la stratégie utilisée.

1

1.3Gb pour une application graphique lourde.

Malheureusement sur Linux, la machine virtuelle Java semble effectuer une pré-demande 1.3G de mémoire virtuelle dans cette situation, ce qui semble mauvais, même si ce n'est pas nécessaire (et provoque beaucoup de confusion grogne des utilisateurs)

1

Lors de ma mémoire application intensive:

-Xms250M -Xmx1500M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC 
Questions connexes