当前位置:网站首页>Allocation de mémoire tas lors de la création d'objets
Allocation de mémoire tas lors de la création d'objets
2022-06-26 10:08:00 【Zz, apprends bien Java.】
ApprendreJavaEn cours,On pense généralement quenewLes objets qui sortent sont tous assignés au tas,En fait, cette conclusion n'est pas tout à fait correcte,Parce que c'est la plupartnewL'objet sortant est assigné au tas,Pas tous..Par la droiteJavaAnalyse du processus d'attribution des objets,On sait qu'il y a deux autres endroits où les objets peuvent être stockés.Ces deux endroits sont empilés séparément (Connaissance de l'analyse des évasions)EtTLAB(Thread Local Allocation Buffer).Commençons par les deux,Et puis ouiJavaDescription du processus d'attribution des objets.
Allocation sur pile
InJVMMoyenne,Heap est partagé par thread,Ainsi, les objets sur le tas sont partagés et visibles pour chaque thread,Il suffit de tenir la référence de l'objet,Vous pouvez accéder aux données des objets stockés dans le tas.Le système de collecte des ordures de la machine virtuelle peut récupérer des objets qui ne sont plus utilisés dans le tas,Mais pour le collecteur d'ordures,Peu importe le filtrage des objets recyclables,Il faut du temps pour récupérer et nettoyer la mémoire.
S'il est déterminé que la portée d'un objet ne s'échappe pas de la méthode,Cela pourrait assigner cet objet à la pile,Voilà.,L'espace mémoire occupé par l'objet peut être détruit avec le cadre de pile sortant de la pile.En application générale,Les objets locaux qui ne s'échappent pas représentent une grande proportion,Si vous pouvez utiliser l'allocation sur la pile,Ce grand nombre d'objets sera détruit automatiquement à la fin de la méthode, Pas besoin d'être recyclé par le collecteur d'ordures , Peut réduire la charge du collecteur d'ordures .
JVM Permet d'assigner des objets privés threadés à la pile , Au lieu d'être assigné au tas . L'avantage assigné à la pile est qu'elle peut être détruite par elle - même après la fin de l'appel de fonction , Sans l'intervention du collecteur d'ordures ,Pour améliorer les performances du système.
Base technique de l'allocation sur pile :
L'un est l'analyse de l'évasion : Le but de l'analyse d'évasion est de déterminer si la portée de l'objet peut s'échapper du corps de la fonction. . Pour une analyse de l'évasion, voir mon autre article :
Deuxièmement, le remplacement scalaire :Permet d'assigner des objets à la pile, Par exemple, si un objet a deux champs , Les deux champs sont attribués comme variables locales .
Seulement dansserver L'analyse d'évasion ne peut être activée qu'en mode ,Paramètres-XX:DoEscapeAnalysisActiver l'analyse d'évasion,Paramètres-XX:+EliminateAllocationsActiver le remplacement scalaire(Ouverture par défaut).Java SE 6u23Après la version,HotSpot L'analyse d'évasion est activée par défaut ,Les options sont disponibles-XX:+PrintEscapeAnalysisVoir les résultats de l'analyse d'évasion.
TLAB
TLABSon nom complet estThread Local Allocation Buffer,C'est - à - dire que le thread assigne localement le cache,C'est une zone d'allocation de mémoire dédiée au thread.
Parce que les objets sont généralement assignés sur le tas , Et le tas est partagé globalement . Donc en même temps ,Il peut y avoir plusieurs Threads qui demandent de l'espace sur le tas.Donc,, Chaque affectation d'objet doit être synchronisée (Adoption de la machine virtuelleCASL'atomicité de l'opération de mise à jour est garantie par une méthode de retry échouée), Et l'efficacité de la distribution dans des situations concurrentielles va encore diminuer .JVMUtiliserTLABPour éviter les conflits multithreadés,Lors de l'attribution de la mémoire à un objet,Chaque fil utilise son propreTLAB,Cela évite la synchronisation des fils,Amélioration de l'efficacité de l'affectation des objets.
TLABElle occupeeEdenEspace régional,OnTLABDans le cas de, L'opportunité virtuelle est ChaqueJava Le thread assigne un morceau TLABEspace.Paramètres-XX:+UseTLABOuvertTLAB,La valeur par défaut est activée.TLABLa mémoire de l'espace est très petite,Par défaut, seule la totalitéEdenSpatial1%, Bien sûr, avec des options -XX:TLABWasteTargetPercentParamètresTLABOccupation de l'espaceEdenTaille en pourcentage de l'espace.
Parce queTLAB L'espace n'est généralement pas grand , Donc les gros objets ne peuvent pas être dans TLABPour distribuer, Toujours directement sur le tas .TLAB Parce que l'espace est plus petit , Il est donc facile de remplir .Par exemple,,Un100KDe l'espace,Déjà utilisé80KB, Quand une redistribution est nécessaire 30KBLorsque l'objet, Il n'y a rien à faire . Il y a deux options pour les opportunités virtuelles ,Premièrement,Abandon actuelTLAB,Ce serait un gaspillage20KBEspace;Deuxièmement,Prends ça.30KB Les objets sont directement assignés au tas ,Conserver leTLAB, On espère qu'à l'avenir, il y aura moins de 20KB Les demandes d'attribution d'objets pour . En fait, la machine virtuelle maintient un système interne appelé refill_wasteValeur de, Lorsque l'objet demandé est supérieur à refill_wasteHeure, Sélectionnez assigner dans le tas ,Si elle est inférieure à cette valeur, Le présent TLAB,NouveauTLAB Pour assigner des objets . Ce seuil peut être utilisé TLABRefillWasteFractionPour ajuster,Il indiqueTLAB Pourcentage de déchets autorisés .La valeur par défaut est64, Cela signifie que l'utilisation est d'environ 1/64DeTLABL'espace commerefill_waste.Par défaut,TLABEtrefill_waste Qui s'adaptent constamment à l'exécution , Optimiser l'état de fonctionnement du système . Si vous voulez désactiver le réglage automatique TLABTaille,Peut être utilisé-XX:-ResizeTLABDésactiverResizeTLAB,Et utiliser-XX:TLABSizeAssigner manuellement unTLABTaille.
-XX:+PrintTLABPeut suivreTLABUtilisation de. Les modifications manuelles ne sont généralement pas recommandées TLABParamètres connexes, Le comportement par défaut de la machine virtuelle est recommandé .
Deux méthodes d'allocation de mémoire d'objet
La tâche d'allouer de l'espace à un objet équivaut à placer un morceau de mémoire de taille déterminée à partir deJavaDiviser en tas.
Collision du pointeur(Serial、ParNewBande d'attenteCompactCollecteur de processus)
HypothèsesJavaLa mémoire dans le tas est absolument régulière,Toute la mémoire utilisée est mise de côté,Mémoire libre de l'autre côté,Un pointeur est placé au milieu pour indiquer le point de démarcation,La mémoire allouée déplace simplement le pointeur vers l'espace libre à une distance égale à la taille de l'objet,Cette répartition s'appelle“Collision du pointeur”(Bump the Pointer).
Liste libre(CMSCette baseMark-SweepCollecteur d'algorithmes)
SiJavaLa mémoire dans le tas n'est pas régulière,La mémoire utilisée et la mémoire libre sont entrelacées,Alors il n'y a aucun moyen de faire un simple claquement de pointeur,La machine virtuelle doit tenir une liste,Notez quels blocs de mémoire sont disponibles,Trouver un espace assez grand dans la liste pour diviser l'Instance objet au moment de l'allocation,Et mettre à jour les enregistrements sur la Liste,Cette répartition s'appelle“Liste libre”(Free List).
Résumé
Processus global
Processus d'attribution des objets
Si l'allocation sur la pile est activée ,JVM Sera distribué sur la pile avancée , Si l'allocation sur la pile n'est pas activée ou si les conditions ne sont pas remplies TLABRépartition,SiTLABAllocation infructueuse, Essayez encore. edenRépartition régionale, Si l'objet remplit les conditions pour entrer directement dans l'âge , Ensuite, il est distribué directement à la génération plus âgée .
La façon dont l'objet est référencé en mémoire 
La structure de l'objet en mémoire
边栏推荐
- Abnormal record-23
- Specific implementation comparison between different programming languages
- cento7.7安装ELK简单记录
- c语言语法基础之——局部变量及存储类别、全局变量及存储类别、宏定义 学习
- 如何更改微信小程序二维码物料颜色
- Code statistics tools cloc and SCC
- Internationalization configuration
- What is the web SSH service port of wgcloud
- From TF 1 X to TF 2.6 (update if you encounter it)
- LeetCode 958. 二叉树的完全性校验
猜你喜欢

exec系列函数(execl、execlp、execle、execv、execvp)使用

MySQL learning summary

做测试需要知道的内容——url、弱网、接口、自动化、

国际化配置

What you need to know to test -- URL, weak network, interface, automation

The 100000 line transaction lock has opened your eyes.

2021-11-29 quintic polynomial of trajectory planning

install opencv-contrib-dev to use aruco code

Go learning notes (83) - code specification and common development skills

Day 3 array, pre post, character space, keyword and address pointer
随机推荐
Automated testing -- Introduction and example of pytest framework
Throttling, anti chattering, new function, coriolism
Extracting public fragments from thymeleaf
Standard implementation of streaming layout: a guide to flexboxlayout
logback
WGCLOUD的web ssh服务端口是多少
pcl install
全渠道、多场景、跨平台,App如何借助数据分析渠道流量
JSP file syntax
What you need to know to test -- URL, weak network, interface, automation
Configuration internationale
Notes on sports planning on November 22, 2021
MapReduce & yarn theory
Poj3682 king arthur's birthday celebration (probability)
SQL advanced tutorial
Today's headline adaptation scheme code
【LeetCode】59. 螺旋矩阵 II
Win10安装tensorflow-quantum过程详解
Deep learning (tentsorflow2. version) three good student performance problems (1)
Day 3 array, pre post, character space, keyword and address pointer