Comprendre L'Allocation de mémoire JVM et Java Out of Memory: Heap Space

je cherche à comprendre vraiment comment fonctionne l'allocation de la mémoire dans le JVM. J'écris une application dans laquelle je perds la mémoire: les exceptions de L'espace de tas.

je comprends que je peux passer dans les arguments VM tels que Xms et Xmx pour augmenter l'espace tas que la JVM alloue pour le processus en cours d'exécution. C'est une solution possible au problème, ou je peux inspecter mon code pour des fuites de mémoire et régler le problème là.

Mes questions sont:

1) Comment la JVM se réserve-t-elle de la mémoire pour elle-même? Comment cela est-il lié à la façon dont L'OS communique la mémoire disponible à la JVM? Ou plus généralement, comment fonctionne l'allocation de mémoire pour n'importe quel processus?

2) Comment fonctionne la mémoire virtuelle? Disons que vous avez un système avec 32 Go de mémoire physique et que vous attribuez tous les 32 Go à votre processus Java. Disons que votre processus consomme les 32 Go de mémoire, Comment Pouvons-nous renforcer le processus pour utiliser la mémoire virtuelle au lieu de vous rencontrez des exceptions?

Merci.

21
demandé sur Peter Lawrey 2014-01-22 06:11:52

4 réponses

comment la JVM affecte-t-elle réellement la mémoire pour elle-même?

pour le tas il alloue une grande région conitnous de la mémoire de la taille maximale. Au départ, il s'agit d'une mémoire virtuelle mais, au fil du temps, elle devient une mémoire réelle pour les portions qui sont utilisées, sous le contrôle de L'OS

comment cela se rapporte - t-il à la façon dont L'OS communique la mémoire disponible à la JVM?

Le JVM n'a aucune idée de la mémoire libre dans le OS.

ou plus généralement, comment fonctionne l'allocation de mémoire pour n'importe quel processus?

En général, il utilise malloc et free.

Comment fonctionne la mémoire virtuelle?

initialement, la mémoire virtuelle est attribuée et se transforme en mémoire réelle telle qu'elle est utilisée. C'est normal pour n'importe quel processus.

disons que vous avez un système avec 32 Go de mémoire physique et vous attribuez tous les 32 Go à votre Processus Java.

Vous ne pouvez pas. L'OS a besoin de mémoire et il y aura de la mémoire à d'autres fins. Même à l'intérieur de la JVM, le tas n'est qu'une partie de la mémoire utilisée. Si vous avez 32 Go de mémoire je suggère comme 24 Go tas max.

disons que votre processus consomme les 32 Go de mémoire,

dites que vous avez 48 Go et que vous démarrez un processus qui utilise 32 Go de mémoire principale.

comment faire respecter la processus pour utiliser la mémoire virtuelle au lieu de courir dans les exceptions OOM?

L'application utilise la mémoire virtuelle dès le début. Vous ne pouvez pas rendre le tas trop grand parce que s'il commence à échanger votre machine (pas seulement votre application) deviendra inutilisable.

Vous pouvez utiliser plus de mémoire que vous avez physique en utilisant la mémoire off heap, soigneusement. Cependant la mémoire gérée doit être dans la mémoire physique donc si vous avez besoin d'un tas de 32 Go, achetez 64 Go de mémoire principale.

21
répondu Peter Lawrey 2016-06-17 21:17:42

la JVM (ou tout autre processus) qui veut allouer de la mémoire appellera l'exécution C' malloc " la fonction. Cette fonction maintient la mémoire tas de l'exécution C. Il obtient à son tour de la mémoire du noyau du système d'exploitation - la fonction utilisée à cet effet dépend de la plate-forme; sous Linux, il pourrait utiliser brk ou sbrk appels système.

une fois que la mémoire a été obtenue par la JVM, elle gère la mémoire elle-même, en allouant des parties de celle-ci aux différents objets créés par le programme courant.

mémoire Virtuelle est gérée entièrement par le noyau du système d'exploitation. Le noyau gère le mappage des pages de mémoire physique vers l'espace d'adresse de divers processus; s'il y a moins de mémoire physique que nécessaire par tous les processus du système, alors le noyau du système d'exploitation en transférera une partie sur le disque.

vous ne pouvez pas (et n'avez pas besoin) forcer les processus à utiliser la mémoire virtuelle. Elle est transparente pour votre processus.

si vous avez des erreurs' out of memory', alors les causes sont probablement:

  1. le système D'exploitation peut être à court d'espace de pagination (ou ne pas avoir d'espace de pagination configuré pour commencer). Ou certains OSs ne prennent même pas en charge la mémoire virtuelle, auquel cas vous êtes à court de mémoire.

  2. la plupart des os ont des facilités pour que l'administrateur limite la quantité de mémoire consommée par un processus - par exemple, dans Linux le setrlimit appel système et / ou commande de shell ulimit, qui fixent toutes deux des limites que le noyau respectera. Si un processus demande plus de mémoire que ce qui est permis par les limites, alors la tentative échouera (typiquement ceci résulte en un message hors de la mémoire).

6
répondu harmic 2014-01-22 02:33:05

ce blog se penche sur L'utilisation de la mémoire Java que vous pourriez trouver utile:

http://www.waratek.com/blog/november-2013/introduction-to-real-world-jvm-memory-utilisation

2
répondu ElastiCat 2014-01-22 09:05:35
  1. la JVM alloue la mémoire Java heap à partir de L'OS et gère ensuite la heap pour L'application Java. Lorsqu'une application crée un nouveau objet, le JVM attribue une zone contiguë de mémoire tas à de les stocker. Un objet dans le tas qui est référencé par un autre objet est "vivant", et reste dans le tas aussi longtemps qu'il continue à être référencé. Les objets qui ne sont plus référencées sont des ordures et peut être évacué du tas pour récupérer le l'espace qu'ils occupent. La JVM effectue une collecte des ordures (CG) pour enlever ces objets, réorganiser les objets restants dans le tas.

    Source: http://pubs.vmware.com/vfabric52/index.jsp?topic=/com.vmware.vfabric.em4j.1.2/em4j/conf-heap-management.html

  2. dans un système utilisant la mémoire virtuelle, la mémoire physique est divisée en des pages de taille égale. La mémoire abordée par un processus est également divisée dans pages logiques de la même taille. Lorsqu'un processus fait référence à un adresse mémoire, le gestionnaire de mémoire récupère à partir du disque la page qui inclut l'adresse référencée, et la place dans un vide physique page dans la mémoire vive.

Source:http://searchstorage.techtarget.com/definition/virtual-memory

2
répondu Little Child 2016-06-17 21:18:31