Windows Phone / Xbox et Android ne prennent pas en charge la récupération de place générationnelle. C'est frustrant pour beaucoup de programmeurs. Il semble y avoir une raison d'ingénierie légitime, mais je ne peux pas le comprendre.
Les téléphones actuels ont plus de mémoire et probablement de meilleurs processeurs que les ordinateurs de bureau / portables exécutant .NET 1.1 avec GC générationnel en 2001, et je ne peux penser à aucune raison pour laquelle les processeurs ARM seraient plus mauvais au GC générationnel que x86. Il y a également moins de besoin de multitâche sur les téléphones et les consoles, donc il y a relativement plus d'espace libre.
Alors qu'est-ce qui donne?
Edit: Quelques points à clarifier:
- Ces plates-formes utilisent exclusivement la récupération de place pour les applications, donc ma question n'est pas de savoir pourquoi GC n'est pas pris en charge; ma question est de savoir pourquoi la collecte des ordures générationnelle ne l'est pas.
- La raison pour laquelle les gens sont frustrés par le manque de GC générationnel est que le GC non générationnel est extrêmement inefficace. (Cela signifie que la durée de vie de la batterie n'est pas la raison.)
- Je crois qu'il y a une raison technique honnête au manque de support générationnel du GC. Ce n'est pas une question rhétorique.
java
.net
android
windows-phone-7
garbage-collection
Rei Miyasaka
la source
la source
Réponses:
Je pense que le plus gros problème est la durée de vie de la batterie. La collecte des ordures est une commodité pour les développeurs achetée au prix de cycles CPU supplémentaires sur l' ordinateur de l'utilisateur . Lorsque votre processeur est branché (ordinateur de bureau) ou dispose d'une batterie relativement grande (ordinateur portable), vos utilisateurs sont plus disposés à payer pour la commodité des développeurs avec l'énergie supplémentaire consommée par le processeur lors de la collecte des ordures. Lorsque la batterie est relativement petite, les utilisateurs peuvent ne pas être aussi généreux. Ils peuvent vouloir cette barre supplémentaire pour eux-mêmes - peut-être pour parler à leurs amis, ou pour tuer quelques porcs supplémentaires dans une rencontre mortelle avec des oiseaux en colère.
Quelles que soient les raisons des utilisateurs, les développeurs de systèmes d'exploitation ne veulent pas se faire une idée que les appareils exécutant leur système d'exploitation déchargent la batterie plus rapidement que ceux qui exécutent le système d'exploitation de leurs concurrents. Ils achètent donc une meilleure perception de la durée de vie prévue de la batterie de leurs appareils au prix de la commodité des développeurs: pour eux, votre douleur n'est pas grave, tant que les utilisateurs sont satisfaits des appareils.
la source
Ma meilleure supposition serait que ce n'est pas une raison technique, mais que les développeurs de ces plateformes téléphoniques n'ont tout simplement pas encore fait l'effort. Je sais que ce n'est pas la réponse que vous espérez, mais si vous avez fait un développement mobile, vous avez probablement remarqué qu'il y a beaucoup de fruits à suspendre. Ils n'ont probablement tout simplement pas eu le temps d'écrire plusieurs implémentations GC, de les affiner toutes et de sélectionner celle qui fait le mieux. Pourquoi est-ce que quelqu'un passerait du temps à réinventer la roue alors qu'il pourrait à la place libérer de nouvelles API flashy et mal pensées? ;)
FWIW, et comme confirmation de ma théorie, le nouveau runtime d'Android (ART) a un GC générationnel et ils prévoient d'avoir un GC de compactage à l'avenir .
la source
Il y a un coût supplémentaire pour la collecte des ordures générationnelle.
Le collecteur générationnel doit pouvoir savoir quand des objets plus anciens pointent vers des objets plus récents. Nous ne pouvons pas retracer l'objet plus ancien pour trouver ces cas, car cela irait à l'encontre du but de la collecte générationnelle. Au lieu de cela, nous devons en quelque sorte détecter quand cela se produit et en prendre note pour la phase de collecte. Quelle que soit la façon dont vous allez procéder, cela ajoutera des frais généraux au processus de collecte.
Sur un système de bureau, votre système d'exploitation est occupé à faire toutes sortes de choses avec de la mémoire dans les coulisses. Il prend en charge des fonctionnalités telles que le partage de pages entre les processus, l'écriture de pages inutilisées sur le disque, le mappage de la mémoire entre les processus, etc. D'après ce que je comprends, certaines des fonctionnalités utilisées permettent de suivre plus efficacement les pointeurs modifiés. L'opération se préoccupe déjà de ce que vous modifiez en mémoire, donc l'utilisation de ces informations à de nouvelles fins n'est pas un problème.
Je soupçonne que les systèmes mobiles ne font pas la même chose dans les coulisses. En conséquence, ils n'ont pas le même niveau d'informations qu'un bureau. Par conséquent, les frais généraux liés à la mise en œuvre d'une collection générale sont plus élevés et moins susceptibles d'en valoir la peine.
la source