Les éboueurs de génération sont-ils intrinsèquement compatibles avec le cache?

38

Un ramasse-miettes générationnel typique conserve les données récemment allouées dans une région de mémoire distincte. Dans le cadre de programmes classiques, de nombreuses données sont de courte durée. Par conséquent, la collecte fréquente de jeunes déchets (un cycle mineur de GC) et la collecte de vieux déchets peu fréquente constituent un bon compromis entre la surcharge de mémoire et le temps passé à effectuer la GC.

Intuitivement, l'avantage d'un récupérateur de déchets générationnel par rapport à un collecteur à une seule région devrait augmenter à mesure que le rapport de latence de la mémoire principale par rapport au cache augmente, car les données de la jeune région sont souvent consultées et conservées au même endroit. Les résultats expérimentaux corroborent-ils cette intuition?

Gilles, arrête de faire le mal
la source
une méta discussion connexe sur les balises appropriées pour la question.
Kaveh

Réponses:

19

Voici quelques articles qui traitent des implications en cache des éboueurs générationnels:

D'après ce que je peux comprendre, le principal problème est que les systèmes ramassés par les ordures ménagent de l'espace en mémoire pour éviter une collecte en amont. La même chose s'applique à la mémoire cache. Comme vous l'avez suggéré, les éléments de la première génération seront probablement conservés dans le cache. Leur affectation et leur collecte seront donc beaucoup plus rapides que celles stockées dans la mémoire principale ou transférées vers le disque. Le problème principal est la taille de la première génération par rapport à la taille de votre cache. Si votre cache se remplit avant la première génération, vous commencez à perdre ces avantages au fur et à mesure que les erreurs s'accumulent.

Matt Balkam
la source
10

Il existe un aspect très délicat de tous les éboueurs que certaines descriptions pourraient passer sous silence: il s'agit de "l'analyse complète" ou de "la collecte complète". Périodiquement, au hasard, par intermittence, ils doivent scanner tous les objets. les collecteurs de génération sont plus aptes à reporter l'analyse complète et à en minimiser la durée, mais cela reste nécessaire.

Le collectionneur générationnel se concentrera sur ce que l’on appelle parfois l’espace «pépinière», mais il devra éventuellement / inévitablement s’amasser sur l’espace «ancien», générant ainsi un balayage complet de la mémoire.

Cette analyse complète est incompatible avec la quasi-totalité des systèmes de mise en cache de la mémoire et (en particulier!) Des schémas de virtualisation, en ce sens que presque tous les systèmes de mise en cache / de virtualisation de la mémoire échoueront / devront échouer lors de toute amélioration des performances dans ce cas.

La réponse clé à cette question est donc de savoir à quelle fréquence l'analyse complète est déclenchée et quelle est la gravité de ses effets lorsqu'elle se produit, et si elle peut être tolérée. cela revient à une propriété / question dépendante de l'application.

En d'autres termes, pour "la plupart" des opérations du collecteur, une cache l'aidera probablement (la cache et le "jeune" espace de la pépinière se chevaucheront généralement!), Mais il existe une périodicité, intermittente, éventuelle, inévitable, lourde, peut-être même une "augmentation massive" [dégradante] des performances lorsque l’espace "ancienne génération" est entièrement collecté et que le "taux de réussite" du cache se dégrade en très mauvais état étant donné que de nombreux objets en dehors de celui-ci sont tous récupérés dans une boucle étroite cycle de balayage / collecte. En d’autres termes, une discontinuité périodique inévitable (où estimations statistiques / moyennes / tendances de la performance, etc. sont trompeuses et inapplicables).

De nouveaux systèmes de collecte conçus pour s’intégrer aux systèmes de gestion de la mémoire sous-jacents (mise en cache / virtualisation) émergent. Il semble en effet que les approches historiques qui découplent complètement les systèmes distincts de collecte de mémoire, de mise en cache et de virtualisation ne fonctionneront pas aussi bien que les approches combinant / intégrant / traitant les trois aspects ensemble.

Voir, par exemple, la collecte de déchets sensible au cache par Zhou et Demsky.

vzn
la source
Vous pouvez donc soutenir que les GC de génération sont compatibles avec le cache par rapport aux non-générationnels (classiques)?
Raphaël
Je dirais que le GC devrait être conçu de manière intégrée avec des caches et de la mémoire virtuelle dans le cadre de sa conception, ce qui est délicat dans les architectures existantes. cependant, pour développer la réponse: oui, les collecteurs de générations agrègent / consolident / groupent les objets fréquemment utilisés dans une mémoire contiguë, ce qui est intrinsèquement plus compatible avec le cache que d'autres conceptions dans lesquelles les objets fréquemment et rarement utilisés sont dispersés / mélangés (bien que ces derniers aura toujours des avantages en cache).
vzn
1
L'un des aspects quelque peu délicat de la fusion d'architectures GC et de mise en cache / virtualisation est que de telles architectures ne se soucient généralement pas du contenu des pages de mémoire, mais qu'elles doivent le faire dans un système GC. Différentes langues promettent parfois aux programmeurs différentes fonctionnalités liées au GC, et il peut être difficile de déterminer quelles fonctionnalités prendre en charge au niveau du système d'exploitation. La meilleure approche serait probablement de dire que chaque objet doit contenir un pointeur sur une structure dont les champs initiaux sont définis par le système d'exploitation, mais qui peuvent être suivis par des données spécifiques à la langue que le système d'exploitation ne connaît pas ou ne tient pas à cœur.
Supercat