Est-il bon de mettre le max et le min de la JVM de la taille du segment de la même manière?
Actuellement dans notre environnement de test le max et le min de la JVM de la taille du segment sont réglés à la même valeur, fondamentalement, autant que le serveur dédié machine le permet pour notre application. Est-ce la meilleure configuration pour plus de performance ou serait de donner la JVM d'une gamme de mieux?
- Lorsque vous définissez le maximum, il alloue la quantité de mémoire virtuelle sur démarrer. Cependant, la quantité de mémoire utilisée augmente lentement que le segment de mémoire est utilisé. Même lorsque vous spécifiez une taille minimale, il n'utilisez pas cet espace immédiatement au lieu de cela, il permet à des tas de grandir à cette taille rapidement.
Vous devez vous connecter pour publier un commentaire.
Raison principale pour définir le -Xms est pour si vous avez besoin d'un certain segment de mémoire au démarrage. (Empêche OutOfMemoryErrors de passe au démarrage.) Comme mentionné ci-dessus, si vous avez besoin du démarrage tas de match le tas max, c'est quand vous match. Sinon, vous n'avez pas vraiment besoin. Juste demande à l'application de prendre plus de mémoire qu'il peut, en fin de compte. En regardant votre utilisation de la mémoire au fil du temps (profilage), tandis que les tests de charge et l'utilisation de votre application devrait vous donner une bonne idée de ce qui à besoin de les mettre à. Mais ce n'est pas la pire chose pour les mettre à la même au démarrage. Pour beaucoup de nos applications, j'ai réellement commencer avec quelque chose comme de 128, 256 ou 512 pour min (démarrage) et un gigaoctet pour max (c'est pour la non application de serveur d'applications).
Viens de trouver cette question sur un débordement de pile qui peut être utile effets secondaires-pour-augmenter-maxpermsize-et-max-heap-taille. Vaut le coup d'oeil.
Xms
serait d'initialiser et de jeter unOOME
alors que de commencer avec un grosXms
serait simplement de ne pas initialiser la machine virtuelle, ce qui n'est guère mieux.Peter 's réponse est correcte dans ce
-Xms
est alloué au démarrage et il va grandir pour-Xmx
(max taille de segment de mémoire) mais c'est un peu trompeur dans la façon dont il a formulé sa réponse. (Désolé Pierre, je sais que vous savez ce truc froid).Réglage ms == mx efficacement désactive ce comportement. Bien que cette habitude d'être une bonne idée dans les anciennes machines virtuelles, il n'est plus le cas. Agrandissement et réduction du segment de mémoire permet à la machine de s'adapter à des augmentations de la pression sur la mémoire encore réduire le temps de pause en réduisant le segment de mémoire lorsque la mémoire de la pression est réduite. Parfois, ce comportement ne vous donne pas les avantages de performance que vous attendez et dans ces cas, il est préférable de mettre en mx == ms.
OOME est levée lorsque le segment est plus que
98%
de temps est consacré à la collecte et les collections ne peut pas récupérer plus de2%
de que. Si vous n'êtes pas au max des tas de la taille puis la JVM va tout simplement grandir, de sorte que vous sommes au-delà des frontières. Vous ne pouvez pas avoir unOutOfMemoryError
au démarrage, à moins que votre tas de hits le max de la taille du segment et répond aux autres conditions qui définissent uneOutOfMemoryError
.Pour les commentaires qui nous sont parvenus depuis que j'ai posté. Je ne sais pas ce que le JMonitor blog entrée est visible mais c'est à partir de la
PSYoung
collector.Je pouvais faire plus de creuser, mais je serais prêt à parier que j'avais trouver le code qui sert le même but dans le
ParNew
etPSOldGen
etCMS Tenured
implémentations. En fait, il est peu probable que la CMS serait en mesure de revenir mémoire, sauf si il y a eu unConcurrent Mode Failure
. Dans le cas d'unCMF
la série collector, et qui devrait inclure un compactage après, le haut de tas plus de chance d'être propre et donc éligibles pour être libéré.Autant que je sache, définissant à la fois de la même taille l'étape supplémentaire de tas de redimensionnement qui pourrait être en votre faveur si vous avez assez bien savoir combien de tas que vous allez utiliser. Aussi, ayant une grande taille de segment de mémoire réduit GC invocations au point qu'il se passe très peu de temps. Dans mon projet actuel (analyse des risques des métiers), notre risque de moteurs à la fois
Xmx
etXms
à la même valeur assez grande (environ 8Gib). Cela garantit que même après une journée entière d'invoquer les moteurs, presque pas de GC.Aussi, j'ai trouvé une discussion intéressante ici.
Certainement
yes
pour un serveur d'application. Quel est l'intérêt d'avoir autant de mémoire mais ne l'utilise pas?(Non, ce n'est pas pour économiser de l'électricité si vous n'utilisez pas une cellule de mémoire)
JVM aime mémoire. Pour une application donnée, plus la mémoire de la JVM a, moins GC qu'il effectue. La meilleure partie est plus les objets meurent jeunes et moins foncière.
Surtout lors d'un démarrage du serveur, la charge est encore plus élevé que la normale. Il est en état de mort cérébrale à donner server un petit mémoire de travail à ce stade.
Xms
n'est pas une limitation sur la quantité de la JVM a, lors de leur lancement. En aparté, la langue comme "mort cérébrale" n'est pas utile.De ce que je vois ici, à http://java-monitor.com/forum/showthread.php?t=427
la JVM en cours de test commence avec la Xms, mais la VOLONTÉ de libérer la mémoire qu'il n'a pas besoin et il va le prendre jusqu'à la Xmx marque quand il en a besoin.
Sauf si vous avez besoin d'un morceau de la mémoire dédiée pour une grande mémoire du consommateur d'abord, il n'y a pas beaucoup d'un point à mettre dans une haute Xms=Xmx. Ressemble de libération de la mémoire et de l'allocation se produire même avec Xms=Xmx