la mémoire dans un programme C/C++ / Java peut être allouée sur la pile ou le tas.
prérequis: disposition de la mémoire du programme C.
Allocation de pile: l’allocation se fait sur des blocs contigus de mémoire. Nous l’appelons une allocation de mémoire de pile car l’allocation se produit dans la pile d’appels de fonction. La taille de la mémoire à allouer est connue du compilateur et chaque fois qu’une fonction est appelée, ses variables obtiennent de la mémoire allouée sur la pile. Et chaque fois que l’appel de fonction est terminé, la mémoire des variables est désallouée., Tout cela se produit en utilisant des routines prédéfinies dans le compilateur. Un programmeur n’a pas à se soucier de l’allocation de mémoire et de la désallocation des variables de pile. Ce type d’allocation de mémoire également connu sous le nom d’allocation de mémoire temporaire car dès que la méthode termine son exécution, toutes les données appartenant à cette méthode sont automatiquement effacées de la pile. Signifie que toute valeur stockée dans le schéma de mémoire de pile est accessible tant que la méthode n’a pas terminé son exécution et est actuellement en cours d’exécution.,
points clés:
- c’est un schéma d’allocation de mémoire temporaire où les membres de données ne sont accessibles que si la méthode( ) qui les contenait est actuellement en cours d’exécution.
- Il alloue ou désalloue la mémoire automatiquement dès que la méthode correspondante termine son exécution.
- Nous recevons l’erreur correspondante Java. lang. StackOverFlowError par JVM, si la mémoire de la pile est complètement remplie.
- l’allocation de mémoire de pile est considérée comme plus sûre par rapport à l’allocation de mémoire de tas car les données stockées ne peuvent être accessibles que par le thread propriétaire.,
- L’allocation et la désallocation de la mémoire sont plus rapides que l’allocation de mémoire de tas.
- La pile-mémoire a moins d’espace de stockage que la pile-mémoire.,373″>
int
b;
int
n = 20;
int
c;
}
Heap Allocation: The memory is allocated during the execution of instructions written by programmers., Notez que le nom tas n’a rien à voir avec la structure de données du tas. Il est appelé tas car il s’agit d’une pile d’espace mémoire disponible pour les programmeurs à allouer et à désallouer. Chaque fois que nous avons créé un objet, il crée toujours dans L’Espace tas et les informations de référence à ces objets sont toujours stockées dans la mémoire de pile. L’allocation de mémoire de tas n’est pas aussi sûre que l’allocation de mémoire de pile l’était car les données stockées dans cet espace sont accessibles ou visibles par tous les threads. Si un programmeur ne gère pas bien cette mémoire, une fuite de mémoire peut se produire dans le programme.,
l’allocation de mémoire de tas est divisée en trois catégories:-ces trois catégories nous aident à prioriser les données(objets) à stocker dans la mémoire de tas ou dans la récupération de Place.
- jeune génération – c’est la partie de la mémoire où toutes les nouvelles données(objets) sont faites pour allouer l’espace et chaque fois que cette mémoire est complètement remplie, le reste des données est stocké dans Garbage collection.,
- génération ancienne ou permanente – c’est la partie de la mémoire de tas qui contient les objets de données plus anciens qui ne sont pas utilisés fréquemment ou qui ne sont pas utilisés du tout.
- génération permanente – c’est la partie de la mémoire de tas qui contient les métadonnées de la JVM pour les classes d’exécution et les méthodes d’application.
points clés:
- nous recevons le message d’erreur correspondant si L’Espace tas est entièrement plein, java. lang.OutOfMemoryError par la JVM.,
- ce schéma d’allocation de mémoire est différent de l’allocation D’espace de pile, ici aucun futur de désallocation automatique n’est fourni. Nous devons utiliser un Garbage collector pour supprimer les anciens objets inutilisés afin d’utiliser la mémoire efficacement.
- Le temps de traitement(Temps D’accès) de cette mémoire est assez lent par rapport à la mémoire de pile.
- La Mémoire de tas n’est pas non plus sécurisée en tant que mémoire de pile, car les données stockées dans la mémoire de tas sont visibles par tous les threads.
- La Taille de la mémoire de tas est assez grande par rapport à la mémoire de pile.,
- La Mémoire Heap est accessible ou existe tant que l’application entière(ou le programme java) s’exécute.,iv>
*ptr =
new
int
;
}
Mélangés exemple de ces deux types d’allocation de mémoire de Tas et de la Pile en java:
ce qui Suit sont les conclusions sur lesquelles nous allons faire après l’analyse de l’exemple ci-dessus:
- Comme nous le début d’exécution de programme, toutes les classes sont stockées dans le Segment de mémoire-la mémoire de l’espace.,
- ensuite, nous trouvons la méthode main () dans la ligne suivante qui est stockée dans la pile avec tout ce qu’elle est primitive (ou locale) et la variable de référence Emp de type Emp_detail sera également stockée dans la pile et indiquera l’objet correspondant stocké dans la mémoire du tas.
- ensuite, la ligne suivante appellera le constructeur paramétré Emp (int, String) de main () et elle allouera également au haut du même bloc de mémoire de pile. Cela stockera:
- LA référence d’objet de l’objet invoqué de la mémoire de la pile.,
- La valeur primitive(type de données primitives) int id dans la mémoire de la pile.
- la variable de référence de L’argument String emp_name qui pointera vers la chaîne réelle du pool de chaînes dans la mémoire du tas.
- ensuite, la méthode main appellera à nouveau la méthode statique Emp_detail (), pour laquelle l’allocation sera faite dans le bloc de mémoire de pile au-dessus du bloc de mémoire précédent.
- Donc, pour l’objet nouvellement créé Emp de type Emp_detail et toutes les variables d’instance seront stockées dans la mémoire du tas.
représentation picturale comme indiqué sur la Figure.,1 ci-dessous:
Fig.1
principales différences entre les Allocations de pile et de tas
- dans une pile, l’allocation et la désallocation sont automatiquement effectuées par alors que, dans le tas, elles doivent être effectuées manuellement par le programmeur.
- La gestion du cadre de tas est plus coûteuse que la gestion du cadre de pile.
- Le Problème de pénurie de mémoire est plus susceptible de se produire dans la pile alors que le problème principal dans la mémoire de tas est la fragmentation.,
- L’accès à la trame de pile est plus facile que la trame de tas car la pile a une petite région de mémoire et est compatible avec le cache, mais dans le cas des trames de tas qui sont dispersées dans la mémoire, cela provoque plus d’erreurs de cache.
- Une pile n’est pas flexible, la taille de mémoire allouée ne peut pas être modifiée alors qu’un tas est flexible et la mémoire allouée peut être modifiée.
- accéder au temps de prise de tas est plus qu’une pile.,
Tableau de Comparaison
Paramètre | PILE | SEGMENT | |
---|---|---|---|
Base | Mémoire est allouée dans un bloc contigu. | Mémoire est allouée dans n’importe quel ordre. | |
Allocation et désallocation | automatique par les instructions du compilateur. | Manuel par le programmeur.,d>Less | More |
Implementation | Hard | Easy | |
Access time | Faster | Slower | |
Main Issue | Shortage of memory | Memory fragmentation | |
Locality of reference | Excellent | Adequate | |
Flexibility | Fixed-size | Resizing is possible | |
Data type structure | Linear | Hierarchical |