当前位置:网站首页>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éthodeComment 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)
0this
1num
2res
  • 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)]

  1. 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

  1. Directives d'exécution 1: iconst_5 ,Constante 5 Appuyez sur la pile d'opérandes

  1. Directives d'exécution 2: invokevirtual #7,Constante 5 Et this Sortir de la pile d'opérandes,Puis appelez this.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.

  1. 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

  1. 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

  1. Directives d'exécution 2: invokevirtual #13,num Et this Sortir de la pile d'opérandes,Puis appelez this.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.

  1. 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

  1. Directives d'exécution 1: bipush ,Constante 10 Appuyez sur la pile d'opérandes

  1. 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

  1. 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

  1. 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 est booleanbytecharshort Et int Type
    • lreturn :La valeur de retour est Long Type
    • freturn :La valeur de retour est Float Type
    • dreturn :La valeur de retour est Double Type
    • areturn :La valeur de retour est le type de référence
    • return :Le type de valeur de retour est void
  • 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.

  1. Méthodes fun2 Fin,Exécution de la dernière directive 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 à fun1 ,Reprise fun1 Tableau des variables locales pour、Pile d'opérandes,Les résultats seront retournés res2 Enregistrer à l'appelant(fun1)Dans la pile d'opérandes

  1. Retour à la méthode fun1(int num) ,Directives d'exécution 5: istore_2,Variables res2 Sortir la pile de l'opérande,Assigner une valeur à l'index dans le tableau des variables locales comme suit: 2 Variable de res1

  1. Directives d'exécution 6: iload_2 ,Du tableau des variables locales,Lire l'index comme 2 Variables res1 Valeur de,Et appuyez sur la pile d'opérandes

  1. 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és res2 Enregistrer à l'appelant(main)Dans la pile d'opérandes

  1. Retour à la méthode main Moyenne,Exécution de la dernière directive 5: pop,Les éléments de la pile d'opérandes sortent de la pile

  1. 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.CollectionPartager 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

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
原网站

版权声明
本文为[Hi DHL]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/186/202207050929403843.html