GNU/Linux >> Tutoriels Linux >  >> Linux

Différence entre le tas Java et le tas C natif

Un processus Java se compose essentiellement de deux espaces de tas différents.

  • Le tas Java (espace nouveau, ancien et permanent)
  • Et le soi-disant tas C natif

Ce qui précède est souvent déroutant en ce qui concerne les erreurs OutOfMemory et les échecs d'allocation. En particulier en mode 32 bits où l'espace de processus global est limité à 4 Go ou même 2 Go selon le système d'exploitation.

Comme mentionné précédemment, la taille totale du processus en mode 32 bits est limitée à 4 Go maximum. Tas Java et tas C combinés, ainsi que d'autres espaces, par ex. pour les bibliothèques, les threads, etc. ne peut pas dépasser cette limite de 4 Go. Donc, si vous augmentez le tas Java, par ex. en augmentant -Xmx/-Xms de 1,5 Go à 2,5 Go, cela aura un effet secondaire significatif sur le C-heap. Avant l'augmentation, le tas C pouvait facilement atteindre 2 Go. Puisqu'il restait 4 Go -1,5 Go =2,5 Go. APRÈS l'augmentation du tas Java de 1,5 Go à 2,5 Go, il ne nous reste plus que 4 Go - 2,5 Go =1,5 Go pour tous les autres espaces. Y compris le tas C.

Malheureusement, la taille du tas Java et du tas C dépend entièrement de l'application. Bien que la taille du tas Java puisse être configurée explicitement, cela ne peut pas être fait pour le tas C. C-heap se développe simplement jusqu'à ce que la taille du processus atteigne la limite de 4 Go. Il faut donc faire attention si vous configurez le tas Java trop grand. Cela peut entraîner et entraînera des échecs d'allocation du tas C. Par exemple. des messages tels que celui-ci signifient généralement que le tas C a été épuisé :

java.lang.OutOfMemoryError: requested 67108872 bytes for Chunk::new. Out of swap space?

Veuillez noter la syntaxe C++ avec les doubles-points. Ou celui-ci :

# There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (malloc) failed to allocate 65544 bytes

Dans les deux cas, le tas C était trop petit. Une solution aurait été de diminuer le tas Java. Oui, pour diminuer ! Cela aurait donné au tas C plus de place pour se développer. D'un autre côté, nous pouvons toujours frapper le classique Java.lang.OutOfMemoryErrors. Ceux-ci indiquent clairement une capacité de tas Java insuffisante.

Comme vous pouvez le voir, si vous travaillez en mode 32 bits, il peut y avoir un conflit entre Java et C-heap, qui peut ne pas être facile à résoudre. Si tout échoue, envisagez de passer à 64 bits, où la limite de taille de processus de 4 Go ne sera plus un problème. Informations générales :La machine virtuelle Java Hotspot (JVM) elle-même est écrite en C++. Par conséquent, toutes les allocations internes de la JVM ont lieu uniquement dans le tas C. Par exemple, lorsque le GC entre en jeu pour collecter des objets morts dans le tas Java, il alloue de l'espace dans le tas natif pour effectuer son travail.

D'autre part, tous les objets Java alloués par un programme Java se retrouveront dans le tas Java. Le tas C ne sera pas touché.


Linux
  1. La Différence Entre [[ $a ==Z* ]] Et [ $a ==Z* ] ?

  2. Quelle est la différence entre Sudo Su - et Sudo Su - ?

  3. La différence entre Getty et Agetty ?

  4. La différence entre .exrc et .vimrc ?

  5. La différence entre "env" et "printenv" ?

Quelle est la différence entre InnoDB et MyISAM ?

Quelle est la différence entre Linux et Unix ?

Qu'est-ce qu'un Hyperviseur ? Quelle est la différence entre les types 1 et 2 ?

Quelle est la différence entre curl et Wget ?

Quelle est la différence entre ls et l ?

Quelle est la différence entre `su -` et `su --login` ?