当前位置:网站首页>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
边栏推荐
- Vs code problem: the length of long lines can be configured through "editor.maxtokenizationlinelength"
- Greendao reported an error in qigsaw, could not init daoconfig
- Idea debugs com intellij. rt.debugger. agent. Captureagent, which makes debugging impossible
- 基于宽表的数据建模应用
- [sourcetree configure SSH and use]
- An article takes you into the world of cookies, sessions, and tokens
- [sorting of object array]
- Online chain offline integrated chain store e-commerce solution
- E-commerce apps are becoming more and more popular. What are the advantages of being an app?
- LeetCode 31. Next spread
猜你喜欢
Why does everyone want to do e-commerce? How much do you know about the advantages of online shopping malls?
Officially launched! Tdengine plug-in enters the official website of grafana
How to empty uploaded attachments with components encapsulated by El upload
How to implement complex SQL such as distributed database sub query and join?
TDengine × Intel edge insight software package accelerates the digital transformation of traditional industries
Solve the problem of no all pattern found during Navicat activation and registration
LeetCode 496. Next larger element I
How to improve the operation efficiency of intra city distribution
Principle and performance analysis of lepton lossless compression
OpenGL - Model Loading
随机推荐
基于宽表的数据建模应用
Kotlin introductory notes (V) classes and objects, inheritance, constructors
Node の MongoDB Driver
Kotlin introductory notes (II) a brief introduction to kotlin functions
Officially launched! Tdengine plug-in enters the official website of grafana
Android 隐私沙盒开发者预览版 3: 隐私安全和个性化体验全都要
LeetCode 556. 下一个更大元素 III
LeetCode 496. 下一个更大元素 I
[Yugong series] go teaching course 003-ide installation and basic use in July 2022
小程序启动性能优化实践
[ctfhub] Title cookie:hello guest only admin can get flag. (cookie spoofing, authentication, forgery)
Unity SKFramework框架(二十四)、Avatar Controller 第三人称控制
OpenGL - Lighting
SQL learning alter add new field
[hungry dynamic table]
测试老鸟浅谈unittest和pytest的区别
tongweb设置gzip
Wechat applet obtains household area information
Dry goods sorting! How about the development trend of ERP in the manufacturing industry? It's enough to read this article
Kotlin introductory notes (VI) interface and function visibility modifiers