Ce qui est Mappé de Pool de mémoire Tampon / Direct de Pool de mémoire Tampon et comment augmenter la taille?
La capture d'écran de VisualVM a été prise quand j'ai couru un IO intensive JVM programme (écrit en Scala), taille de segment de mémoire est de 4 GO et de 2 GO ont été en cours d'utilisation. La JVM programme utilise le fichier mappé en mémoire.
Ce n' "mappé de pool de mémoire tampon" et "direct de pool de mémoire tampon" signifie?
Ces piscines semblent être très complet. Depuis la JVM programme utilise le fichier mappé en mémoire, vais-je voir une augmentation de la performance si les piscines étaient plus grandes? Si oui, comment augmenter la taille?
La taille de tous les fichiers mappés sont de l'ordre de 1.1 GO en taille.
Vous devez vous connecter pour publier un commentaire.
Direct Tampon
Un direct tampon est une partie de la mémoire généralement utilisé pour l'interface Java à l'OS I/O sous-systèmes, par exemple comme un endroit où l'OS écrit des données qu'il reçoit à partir d'une prise ou un disque, et à partir de laquelle Java peut lire directement.
Le partage de la mémoire tampon avec le système d'exploitation est beaucoup plus efficace que l'approche originale de copier des données à partir de l'OS en Java du modèle de mémoire, ce qui rend les données soumises à la Collecte des Déchets et de dysfonctionnements tels que la re-copie des données comme il se déplace de l'eden -> survivant -> poste permanent -> à la génération permanente.
Dans la capture d'écran, vous avez juste un tampon de 16 KO de direct tampon. Java va croître de ce groupe, comme l'exige donc le fait que la zone bleue est en haut du bloc est simplement une déclaration que tous les tampons de la mémoire allouée jusqu'à présent est en cours d'utilisation. Je ne vois pas cela comme un problème.
Mappé de pool de mémoire tampon
Mappés de pool de mémoire tampon est toute la mémoire utilisée par Java pour son FileChannel instances.
Chaque FileChannel exemple, a une mémoire tampon partagée avec le système d'exploitation (similaire à l'direct tampon avec tous les avantages d'efficacité). La mémoire est essentiellement un RAM fenêtre sur une partie du fichier. Selon le mode (lecture, écriture ou les deux), Java pouvez lire et/ou modifier le contenu du fichier directement et le système d'exploitation peut fournir directement des données de couleur ou modifié les données sur le disque.
Les autres avantages de cette approche est que l'OS peut éliminer ce tampon directement sur le disque comme il l'entend, comme lorsque le système d'exploitation est en cours d'arrêt, et le système d'exploitation peut verrouiller la partie du fichier à partir d'autres processus sur l'ordinateur.
La capture d'écran vous indique que vous avez au sujet de 680MO en cours d'utilisation par 12 FileChannel objets. Encore une fois, Java va grandir c'est Scala a besoin de plus (et la JVM peut obtenir plus de mémoire à partir de l'OS), donc le fait que tous les 680MO est tous en cours d'utilisation n'est pas important. Compte tenu de leur taille, il me semble que le programme a déjà été optimisé pour utiliser ces tampons efficacement.
L'augmentation de la taille de la mappé de pool de mémoire tampon
Java alloue de la mémoire à l'extérieur de la Collecte des Déchets de l'espace pour la FileChannel tampons. Cela signifie que la normale, taille du tas de paramètres tels que
-Xmx
ne sont pas importants iciLa taille de la mémoire tampon dans un FileChannel est réglé avec le carte méthode. Changer cela impliquerait de changer votre Scala programme
Une fois que le tampon a atteint un seuil de taille, de l'ordre de 10-100 KO), l'augmentation de FileChannel taille de la mémoire tampon peut ou ne peut pas augmenter la performance dépend de la façon dont le programme utilise le tampon:
Essayer le profilage de l'application et de regarder pour les e/S attend (Jprofiler et YourKit sont bonnes). Il se peut que l'e/S de fichier n'est pas réellement un problème - ne soyez pas une victime de l'optimisation prématurée. Si I/O temps d'attente sont une partie importante du temps total écoulé, alors il peut être vaut la peine d'essayer une plus grande taille de la mémoire tampon
De plus amples informations
https://blogs.oracle.com/alanb/entry/monitoring_direct_buffers
Aussi être conscient qu'il ya un bug signalé sur la JVM dire que FileChannel n'est pas bon à la libération de la mémoire. C'est détaillée dans Empêcher le dépassement de mémoire lors de l'utilisation de java.nio.MappedByteBuffer