2013-03-19 1 views
0

La récupération de place (générationnelle) de copie offre les meilleures performances de toute forme de gestion automatique de la mémoire, mais nécessite la correction de pointeurs vers des blocs de données relocalisés. Ceci est activé, dans les langages qui supportent cette technique de gestion de la mémoire, en interdisant l'arithmétique du pointeur et en s'assurant que tous les pointeurs sont au début des objets identifiables. Si vous générez du code au moment de l'exécution avec un compilateur JIT, les choses sont un peu plus compliquées car les adresses de retour de la pile d'appels pointent vers le début, mais pas vers le début des blocs de code. un problème.Copie de la récupération de place du code généré

Comment cela est-il typiquement résolu?

+0

Je dirais que le code est vérifié avant d'être transmis au JIT. – leppie

Répondre

1

Assez souvent, vous ne pas déplacer le code. C'est à la fois parce qu'il est compliqué de réparer la pile et les autres adresses (pensez sauts à travers les fragments de code), et parce que vous n'avez pas vraiment besoin de garbage collection pour un tel code. peut faire la gestion manuelle de la mémoire). Vous ne vous attendez pas non plus à créer beaucoup de code machine (par rapport aux objets applicatifs), donc la fragmentation n'est pas un problème.

Si vous insistez pour déplacer le code de la machine et réparer la pile, est d'une manière, je pense: Similaire à Mark-Compact, construire une "table break" (je ne sais pas d'où vient ce nom; "table de relocalisation" pourrait être plus clair) qui vous indique la quantité par laquelle vous devriez ajuster les pointeurs aux objets déplacés. Maintenant, parcourez la pile pour les adresses de retour (très spécifiques à la plate-forme, bien sûr) et corrigez-les si elles se réfèrent au code déplacé. Au lieu de rechercher des correspondances exactes, recherchez l'adresse la plus élevée inférieure à l'adresse de retour que vous remplacez actuellement. Vous pouvez vérifier que cette adresse fait effectivement référence à un code machine qui s'est déplacé en regardant la taille de l'objet (vous avez un pointeur vers le début de l'objet, après tout). Cette approche n'est pas réalisable pour tous les objets, pour diverses raisons.

Il existe d'autres raisons de faire quelque chose de similaire. Certains compilateurs JIT proposent remplacement sur pile, ce qui signifie créer une nouvelle version (par exemple plus optimisée, ou moins optimisée) de certains codes machine et remplacer toutes les occurrences de l'ancienne version par celle-ci. C'est beaucoup plus compliqué que de simplement corriger les adresses de retour. Vous devez vous assurer que la nouvelle version continue logiquement où l'ancienne a été laissée suspendue. Je suis pas familier avec la façon dont cela est mis en œuvre, donc je ne vais pas entrer dans les détails.

Questions connexes