当前位置:网站首页>Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
Roll up, break 35 - year - old Anxiety, animation Demonstration CPU recording Function call Process
2022-07-05 09:45:00 【Hi DHL】
hi Bonjour tout le monde,Je suis DHL.Numéro public:ByteCode ,Focus on Sharing interesting hardcore original content,Kotlin、Jetpack、Optimisation des performances、Code source du système、Algorithme et structure des données、Animation、Dachang face Classic
Le texte intégral est divisé en Version vidéo Et Version texte,
Version vidéo:
Par la voix et l'animation,Pour une vue plus intuitive,Procédure d'appel et de retour de la méthode d'enregistrement de mémoire.
bilibili Adresse: b23.tv/TQXL4xx
Version texte
Est - ce qu'on a réfléchi en écrivant le Code Comment appeler la méthode 、 Comment retourner après l'exécution de la méthode 、 .Comment la mémoire enregistre les procédures d'appel de méthode .Et c'est l'objet de cet article aujourd'hui.
Les procédures d'appel de méthode et de retour impliquent,Pile de machines virtuelles、Compteur de programmes、Tableau des variables locales、Pile d'opérandes、Adresse de retour de la méthode、Liens dynamiques, etc,Il y a beaucoup de points de connaissance impliqués,Et ce sont aussi des questions d'entrevue à haute fréquence,Donc je vais diviser en plusieurs articles,Effectuer une analyse détaillée de chaque point de connaissance.Et aujourd'hui, cet article se concentre sur la façon dont la mémoire enregistre les appels de méthode et les procédures de retour.
Pile de machines virtuelles
Java La méthode prend la forme d'un cadre de pile,Exécuter sur la pile de machines virtuelles(Java Pile)Moyenne,La pile est privée au fil,Au début du programme,Va créer un main Thread,Le système d'exploitation alloue un segment de mémoire à chaque thread,Une pile de machines virtuelles est créée lorsque le thread est créé,Le cycle de vie de la pile de machines virtuelles est le même que celui du thread,Le fil est fini,La pile de machines virtuelles a également été détruite.
Chaque Java Méthodes,Correspond à un cadre de pile,Donc la méthode commence et se termine,C'est le processus d'entrée et de sortie des cadres de pile,Les effets sont présentés ci - dessous.
Cadre de pile
Chaque Java Méthodes,Ce sont des cadres de pile,Chaque cadre de pile contient:Tableau des variables locales、Pile d'opérandes、Adresse de retour de la méthode、Liens dynamiques、Informations complémentaires.
- Tableau des variables locales: Enregistrer la liste des paramètres de la méthode et les variables locales dans la méthode,Stocker dans l'ordre déclaré,Il se présente sous forme de tableau,Si c'est une méthode d'instance,Index As 0 - Oui. this Références,Comme le montre la figure ci - dessous.
Index(Slot) | Nom(Name) |
---|---|
0 | this |
1 | num |
2 | res |
- Pile d'opérandes: Enregistrer les résultats provisoires pendant l'exécution de la méthode
- Adresse de retour: Enregistrer le pc Valeur du Registre(C'est - à - dire: JVM Adresse de l'instruction),Utilisé à la fin de la méthode,Retour à l'utilité,Poursuivre la méthode de l'appelant
- Liens dynamiques: Référence à la méthode à laquelle appartient ce cadre de pile dans le pool de constantes d'exécution,C'est - à - dire trouver la référence symbolique de la méthode cible dans le pool constant,Puis converti en référence directe
Informations complémentaires:Comme la procédure debug Quelques informations supplémentaires ajoutées(C'est pas important.,Pas besoin de se soucier,Négligeable)
Il suffit de savoir ce qu'ils font ici,Leur structure de données、Signification du code byte、Processus d'exécution, etc,Dans les articles suivants, je vais faire une analyse détaillée de chaque point de connaissance.
Procédure d'appel de méthode
Écrivez d'abord un code pour l'appel de méthode,Appelle d'abord main()
Appelé après la méthode fun1()
Puis appelez fun2()
,Comme le montre la figure ci - dessous.
Maintenant, faisons une démonstration. Java Les machines virtuelles exécutent ces JVM Le processus de la directive,Appelle d'abord main () Méthodes.
main () Méthodes
main()
Méthodes l'effet d'animation du processus d'exécution est le suivant.
[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-ApkZcRTw-1654832156342)(https://img.hi-dhl.com/16541790180176.gif)]
- Directives d'exécution
0: aload_0
,Du tableau des variables locales,Lire l'index comme 0 Valeur de,Appuyez sur la pile d'opérandes,Parce que c'est une méthode d'instance,Donc l'index est 0 La valeur de this Références
- Directives d'exécution
1: iconst_5
,Constante 5 Appuyez sur la pile d'opérandes
- Directives d'exécution
2: invokevirtual #7
,Constante 5 Et this Sortir de la pile d'opérandes,Puis appelezthis.fun1(5)
Trouvez d'abord la méthode du pool constant fun1()
Référence symbolique pour,Les références symboliques sont ensuite converties en références directes par des liens dynamiques,Appelé plus tard this.fun1(5)
,Méthode fun1()
Appuyez sur la pile de machines virtuelles comme cadre de pile,Passer à fun1()
,Continuez vers le bas.
Comment trouver la référence symbolique de la méthode cible dans le pool constant,Puis le processus de conversion en référence directe,Une analyse détaillée sera présentée dans une prochaine série d'articles
En appelant fun1()
Avant,fun1()
La Table des variables locales et l'adresse de retour de la méthode ont été déterminées.
Méthode d'entrée fun1 (int num)
Méthodes fun1(int num)
L'effet d'animation du processus d'exécution est le suivant.
- Directives d'exécution
0: aload_0
,Du tableau des variables locales,Lire l'index comme 0 Valeur de,Appuyez sur la pile d'opérandes.Parce que c'est une méthode d'instance,Donc l'index est 0 La valeur de this Références
- Directives d'exécution
1: iload_1
,Du tableau des variables locales,Lire l'index comme 1 Variables num Valeur de,Et appuyez sur la pile d'opérandes
- Directives d'exécution
2: invokevirtual #13
,num Et this Sortir de la pile d'opérandes,Puis appelezthis.fun2(num)
Trouvez d'abord la méthode du pool constant fun2()
Référence symbolique pour,Les références symboliques sont ensuite converties en références directes par des liens dynamiques,Appelé plus tard this.fun2(num)
,Méthode fun2()
Appuyez sur la pile de machines virtuelles comme cadre de pile,Passer à fun2()
,Continuez vers le bas,Appelez fun2()
Avant,fun2()
La Table des variables locales et l'adresse de retour de la méthode ont été déterminées.
Méthode d'entrée fun2 (int num)
Méthodes fun2(int num)
L'effet d'animation du processus d'exécution est le suivant.
- Directives d'exécution
0: iload_1
,Du tableau des variables locales,Lire l'index comme 1 Variables num Valeur de,Et appuyez sur la pile d'opérandes
- Directives d'exécution
1: bipush
,Constante 10 Appuyez sur la pile d'opérandes
- Directives d'exécution
3: iadd
,num Et constante 10 Sortir de la pile d'opérandes,Puis ajoutez,Appuyez sur le résultat dans la pile d'opérandes
- Directives d'exécution
4: istore_2
,Extraire les résultats de la pile d'opérandes,Et assigner une valeur à l'index dans le tableau des variables locales comme 2 Variable de res2
- Directives d'exécution
5: iload_2
,Du tableau des variables locales,Lire l'index comme 2 Variable de res2 Valeur de,Et appuyez sur la pile d'opérandes
Méthode sortie du processus
Chaque méthode est un cadre de pile,Chaque cadre de pile enregistre l'adresse de retour de la méthode,Mise en œuvre return
Lors d'une série de commandes,Adresse de retour qui sera sauvegardée selon le cadre de pile actuel,Retour à l'emplacement de l'appel,Continuez vers le bas.Il y a donc deux situations.
Sortie anormale
Si une exception s'est produite et qu'elle a été saisie,Il cherche dans le tableau des exceptions PC Adresse du Registre(JVM Adresse de l'instruction),Retour à l'appel pour continuer.
Faites ce qui suit lorsque vous quittez normalement
- Restaurer la table des variables locales du cadre de pile précédent、Pile d'opérandes
- S'il y a une valeur de retour,Appuyez sur la valeur de retour dans la pile d'opérandes du cadre de la pile d'appelants,Y a - t - il une valeur de retour basée sur
return
JVM Directives:ireturn
:La valeur de retour estboolean
、byte
、char
、short
Etint
Typelreturn
:La valeur de retour estLong
Typefreturn
:La valeur de retour estFloat
Typedreturn
:La valeur de retour estDouble
Typeareturn
:La valeur de retour est le type de référencereturn
:Le type de valeur de retour estvoid
- Pour définir le cadre de la pile d'appelants JVM Adresse de l'instruction
- Le cadre de pile actuel sort de la pile de la machine virtuelle
Dans cet article, nous n'analysons que le processus normal de sortie,Le processus de sortie anormale et de sortie normale est à peu près le même.L'effet d'animation normal du processus de sortie est le suivant.
- Méthodes
fun2
Fin,Exécution de la dernière directiveireturn
,Le cadre de pile actuel sort de la pile de la machine virtuelle,Renvoie l'adresse selon la méthode enregistrée dans le cadre de pile actuel,Retour à fun1 ,Reprise fun1 Tableau des variables locales pour、Pile d'opérandes,Les résultats seront retournésres2
Enregistrer à l'appelant(fun1)Dans la pile d'opérandes
- Retour à la méthode
fun1(int num)
,Directives d'exécution5: istore_2
,Variablesres2
Sortir la pile de l'opérande,Assigner une valeur à l'index dans le tableau des variables locales comme suit: 2 Variable deres1
- Directives d'exécution
6: iload_2
,Du tableau des variables locales,Lire l'index comme 2 Variablesres1
Valeur de,Et appuyez sur la pile d'opérandes
- Méthode d'exécution fun1 Dernière directive
7: ireturn
,Le cadre de pile actuel sort de la pile de la machine virtuelle,Renvoie l'adresse selon la méthode enregistrée dans le cadre de pile actuel,Retour à main Méthodes,Reprise main Tableau des variables locales de la méthode、Pile d'opérandes,Les résultats seront retournésres2
Enregistrer à l'appelant(main)Dans la pile d'opérandes
- Retour à la méthode
main
Moyenne,Exécution de la dernière directive5: pop
,Les éléments de la pile d'opérandes sortent de la pile
- Exécution de la dernière directive
6: return
,Tous les appels de méthode sont terminés,Mémoire utilisée par la méthode,Sera également retourné au système
Chaque appel de méthode,C'est le processus d'entrée et de sortie des cadres de pile,Une partie de la mémoire est également nécessaire,Pour enregistrer la table des variables locales、Pile d'opérandes、Adresse de retour de la méthode、Liens dynamiques、Informations complémentaires, etc.
Lorsque la méthode est terminée,C'est - à - dire que le cadre de la pile sort de la pile,Mémoire utilisée par l'appel de méthode,Sera également retourné au système.
Le texte complet est terminé ici.,Merci pour votre lecture,Si ça aide,Bienvenue Je regarde
、 - Oui.
、 Collection
、 Partager
Pour les amis autour de.
Je vous recommande sincèrement de me suivre,Numéro public:ByteCode ,Partage continu du contenu original du noyau dur,Kotlin、Jetpack、Optimisation des performances、Code source du système、Algorithme et structure des données、Animation、Dachang face Classic.
Articles à lire prochainement
- C'est vraiment long de découvrir les réflexes? ,Tire! 10 Combien de temps ça prend?
- Tu le sais. Iterable C'est lent? ? Essayez - le pour améliorer les performances
- Découvrir les secrets Kotlin 1.6.20 Fonction de pesage Context Receivers
- Stack Overflow Le plus chaud 10 - Oui. Kotlin Questions
- Android 12 C'est arrivé,La tienne. App Il s'est effondré?
- Google Déclaration d'abandon LiveData.observe Méthodes
- Impact sur le rendement Kotlin Code(Un.)
- Découvrir les secrets Kotlin Dans == Et ===
Enfin, des projets de mise à jour et d'entretien à long terme sont recommandés
Blogs personnels,Trier tous les articles,Bienvenue à vérifier https://hi-dhl.com
KtKit Petit et pratique,Avec Kotlin Bibliothèque d'outils écrits dans la langue,Bienvenue à vérifier KtKit
Planifier la création d'un、Dernière mise à jour AndroidX Jetpack Éléments opérationnels des composantes connexes et analyse des principes des composantes connexes,Ça augmente Jetpack Nouveaux membres,Mise à jour continue de l'entrepôt,Bienvenue à vérifier AndroidX-Jetpack-Practice
LeetCode / Un doigt d'épée. offer / Questions d'entrevue pour les grandes usines au pays et à l'étranger / Résolution multithreadée,Langues Java Et kotlin,Contient plusieurs solutions、Comment résoudre le problème、Complexité temporelle、Analyse de la complexité spatiale
- Un doigt d'épée. offer Et des entretiens d'usine au pays et à l'étranger:Lire en ligne
- LeetCode Série de questions:Lire en ligne
边栏推荐
- 百度智能小程序巡檢調度方案演進之路
- mysql安装配置以及创建数据库和表
- 微信小程序获取住户地区信息
- 从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择
- [listening for an attribute in the array]
- Principle and performance analysis of lepton lossless compression
- TDengine ×英特尔边缘洞见软件包 加速传统行业的数字化转型
- 【js 根据对象数组中的属性进行排序】
- 【两个对象合并成一个对象】
- How do enterprises choose the appropriate three-level distribution system?
猜你喜欢
OpenGL - Model Loading
一次 Keepalived 高可用的事故,让我重学了一遍它
Deep understanding of C language pointer
A detailed explanation of the general process and the latest research trends of map comparative learning (gnn+cl)
解决Navicat激活、注册时候出现No All Pattern Found的问题
图神经网络+对比学习,下一步去哪?
Nips2021 | new SOTA for node classification beyond graphcl, gnn+ comparative learning
The writing speed is increased by dozens of times, and the application of tdengine in tostar intelligent factory solution
植物大战僵尸Scratch
Viewpager pageradapter notifydatasetchanged invalid problem
随机推荐
Talking about the difference between unittest and pytest
微信小程序获取住户地区信息
阿里十年测试带你走进APP测试的世界
Figure neural network + comparative learning, where to go next?
百度评论中台的设计与探索
A detailed explanation of the general process and the latest research trends of map comparative learning (gnn+cl)
[object array A and object array B take out different elements of ID and assign them to the new array]
TDengine ×英特尔边缘洞见软件包 加速传统行业的数字化转型
[ctfhub] Title cookie:hello guest only admin can get flag. (cookie spoofing, authentication, forgery)
【数组的中的某个属性的监听】
植物大战僵尸Scratch
How to empty uploaded attachments with components encapsulated by El upload
基于宽表的数据建模应用
Kotlin introductory notes (VII) data class and singleton class
Understand the window query function of tdengine in one article
百度智能小程序巡检调度方案演进之路
一篇文章带你走进cookie,session,Token的世界
Thermometer based on STM32 single chip microcomputer (with face detection)
Kotlin introductory notes (IV) circular statements (simple explanation of while, for)
TDengine 离线升级流程