Quels sont les inconvénients dans l'utilisation de la Collecte des Ordures?
La plupart des langues modernes ont construit dans le garbage collection (GC). par exemple, Java, .NET languages, Ruby, etc. En effet GC simplifie le développement d'applications dans de nombreuses façons.
Je suis intéressé à connaître les limites et les inconvénients de l'écriture d'applications dans GCed langues. En supposant GC mise en oeuvre est optimale, je me demandais simplement nous peut être limitée par GC pour prendre quelques optimisation des décisions.
stackoverflow.com/questions/1424660/...
Si cette question a un titre générique, il demande seulement sur les erreurs et les développeurs de faire s'ils sont de la programmation en aucun GC langues.
Si cette question a un titre générique, il demande seulement sur les erreurs et les développeurs de faire s'ils sont de la programmation en aucun GC langues.
OriginalL'auteur rpattabi | 2010-07-09
Vous devez vous connecter pour publier un commentaire.
Les principaux inconvénients de l'utilisation d'un ramasse-miettes, à mon avis, sont:
Non-déterministe de nettoyage de ressources. Parfois, il est pratique de dire "j'en ai fini avec cela, et je le veux nettoyer MAINTENANT". Avec un GC, cela signifie généralement forcer la GC pour le nettoyage de tout, ou tout simplement attendre jusqu'à ce qu'il est prêt - à la fois de prendre de suite un certain contrôle de vous en tant que développeur.
Éventuels problèmes de performances qui découlent de la non-déterministe du fonctionnement de la GC. Lors de la GC de la collecte, il est fréquent de voir des (petites) se bloque, etc. Cela peut être particulièrement problématique pour des choses telles que le temps réel des simulations ou des jeux.
N'est-il pas grand? J'aime être en mesure d'avoir quelque chose à blâmer pour ça... 😉
Est Non-déterministe de nettoyage de la commune GC problème? ou particuliers GC implémentations?
Les GC, de par leur nature, ont tendance à presque toujours non-déterministe de nettoyage. C'est vraiment un point important pour la GC, en premier lieu, - vous n'avez pas à vous soucier de quand ou comment la mémoire est libérée, et laisser le collecteur.
"Avec un GC, cela signifie généralement l'..." vous n'utilisez pas la table pour le faire.
OriginalL'auteur Reed Copsey
Prendre d'un programmeur en C ... c'est sur le coût/bénéfice et l'utilisation appropriée
De la collecte des déchets des algorithmes tels que le tri-couleur/mark-and-sweep il y a souvent des temps de latence entre une ressource qui est "perdu" et de la physique des ressources libérées. Dans certaines exécutions de la GC fait suspendre l'exécution du programme pour effectuer la collecte des ordures.
Étant un long temps programmeur en C, je peux vous dire:
a) Manuel de free() la collecte des ordures est dur -- C'est parce qu'il est généralement un plus grand taux d'erreur de placement de l'homme de free() appels que les algorithmes de GC.
b) Manuel gratuit() collecte des ordures coûts de temps à -- est-ce que le temps passé à le débogage de l'emporter sur l'ordre de la milliseconde pauses d'un GC? Il peut être utile de se servir de la collecte des ordures si vous écrivez un jeu que dire intégré noyau.
Mais, quand vous ne pouvez pas se permettre l'exécution d'inconvénient (droit de ressources, les contraintes temps-réel) puis en effectuant manuel de l'allocation des ressources est probablement mieux. Cela peut prendre du temps, mais peut être efficace à 100%.
Imaginez un noyau de système d'exploitation écrit en Java? ou de sur la .NET runtime avec GC ... il suffit de regarder la quantité de mémoire de la JVM s'accumule lors de l'exécution des programmes simples. Je suis conscient qu'il existe des projets comme ça ... ils me font me sentir un peu malade.
Suffit de garder à l'esprit, ma boîte linux fait bien les mêmes choses aujourd'hui, avec 3 go de RAM qu'il a fait quand il a 512 mo de ram il y a des années. La seule différence est que j'ai mono/jvm/firefox etc en cours d'exécution.
L'analyse de rentabilisation pour la GC est clair, mais il me fait encore mal à l'aise beaucoup de temps.
De bons livres:
Dragon book (dernière édition), Moderne Compilateur mise en Œuvre en C
Copsey, Dis-moi à ce sujet. Mais, un programme qui est écrit comme un ensemble de 'tourner' les algorithmes peuvent avoir une allocation sans trop de maux de tête.
Il est tout au sujet de l'évaluation des coûts/avantages. Il peut être plus simple pour le programmeur, mais le coût d'un système d'exploitation est plus qu'une simple application d'entreprise.
Je ne mentionne cela parce que j'ai eu à écrire mon propre allocateurs avec compactage. Si vous êtes à la demande est relativement plat, l'utilisation de la mémoire de modèle, il est assez facile, et beaucoup plus efficace, mais si elle ne l'est pas, c'est une douleur royale dans l' ....
Il est en fait la recherche dans ce domaine. Certains graves, et beaucoup de hobbiest (comme jos.sourceforge.net) la Plupart des systèmes d'exploitation ont leurs propres routines de gestion de mémoire que beaucoup de ce qu'un GC pour un exécutable déjà, mais...
OriginalL'auteur Aiden Bell
Pour .NET, il y a deux inconvénients que je peux voir.
1) les Gens supposent que le GC connaît le mieux, mais ce n'est pas toujours le cas. Si vous faites des certains types d'allocations, vous pouvez faire vous-même à l'expérience de certains de vraiment méchant programme décès sans direct invokation de la GC.
2) des Objets de plus de 85k aller sur la liturgie des heures, ou des Objets Volumineux. Ce segment est actuellement JAMAIS compacté, encore une fois, votre programme peut l'expérience de mémoire d'exceptions, quand vraiment la liturgie des heures n'est pas compactée assez pour vous de faire une autre allocation.
Ces deux bugs sont indiqués dans le code que j'ai posté dans cette question:
Comment puis-je obtenir .NET pour collecter les ordures de façon agressive?
Oui. Pour l'essentiel, dans .NET, un seul 85k de répartition (c'est à dire: un grand tableau de structures) sont alloués à l'aide d'un "traditionnels" style de l'allocation, et de ne pas être compacté avec le reste du tas GC.
Copsey: C'est intéressant. Je vois, en regardant spécifiques GC mises en œuvre possible du point de limites précises à eux, bien que la plupart des problèmes sont communs.
+1 - j'ai rencontré quelques très invalidante problèmes avec la liturgie des heures et des .Net, esp lors de l'exécution de toute sorte de COM-l'Interopérabilité ou la création de Windows modules de services qui s'exécutent pendant des jours. Je souhaite qu'il y ait une solution pour forcer la purge de la liturgie des heures .Net.
Je me demande pourquoi la liturgie des heures alloue des choses sur les petites limites, et non 4K limites? Rembourrage une 85K+ objet de la prochaine 4K serait déchets à plus de 20% de l'espace, et le LOH pourrait alors être compacté à l'aide de la table des pages. Comme il est, ma philosophie de base ont tendance à être "éviter d'allouer rien de plus de 80K".
OriginalL'auteur mmr
Ma conviction est que la gestion automatique de la mémoire impose un plafond de verre sur l'efficacité, mais je n'ai pas de preuves à l'appui. En particulier, aujourd'hui GC algorithmes offrent seulement un débit élevé ou faible temps de latence, mais pas les deux simultanément. Les systèmes de Production comme .NET et de la JVM HotSpot engager des pauses, précisément parce qu'ils sont optimisés pour le débit. Spécialisé GC algorithmes comme Staccato offre de latence beaucoup plus faible, mais au prix de beaucoup inférieur au minimum mutateur d'utilisation et, par conséquent, un faible débit.
OriginalL'auteur Jon Harrop
Si vous êtes confiant(bonne) sur votre gestion de la mémoire de compétences, il n'y a pas d'avantage.
Le concept a été introduit pour réduire le temps de développement et en raison du manque d'experts en programmation qui a bien compris la mémoire.
Il existe de NOMBREUX avantages à une table, même si vous êtes très compétent et confiant dans votre gestion de la mémoire. Ceci est particulièrement vrai si vous utilisez un compactage GC...
La réponse est un peu béat de l'OMI. C'est comme de dire que le C a été inventé pour les personnes qui ne sont pas bien comprendre l'assembleur. La collecte des ordures simplifie grandement la programmation et permet donc un développement plus efficace. Le plein contrôle sur la mémoire est nécessaire dans très peu d'endroits, comme le sont la performance théorique des gains.
la collecte des Ordures simplifie grandement la programmation - n'est-ce pas ce que j'ai écrit. Et, je ne suis jamais contre GC, j'ai juste dit pourquoi il a été introduit, vous pouvez différer, c'est juste mon avis(comment je vois les choses). C certainement rendu plus facile pour les gens de programme de l'assemblée.
Les fuites de mémoire sont généralement causées par des choses manquées, pas de manque de compétences. Bien que I ne pas écrire de bugs, j'entends qu'ils arrivent aux autres à cause de cette raison.
OriginalL'auteur Ramadheer Singh
Le plus gros problème quand il s'agit de la performance (en particulier sur le ou les systèmes temps-réel), votre programme peut rencontrer certains retards imprévus lors de la GC de coups de pied dans. Cependant, moderne GC essayer d'éviter cela et peut être réglée en temps réel fins.
Une autre chose la plus évidente est que vous ne pouvez pas gérer votre mémoire par vous-même (par exemple, allouer sur numa mémoire locale), que vous pouvez faire lorsque vous implémentez des logiciels de bas niveau.
Contrairement à ce que je pensais .NET a une saveur pour des applications embarquées appelé .NET Micro Framework. Il a GC.
Copsey: Mais alors, vous avez de l'OMI déjà quelques système hybride qui permet à la fois. Je pense que la plupart GC langues ne permettent pas une telle chose.
OriginalL'auteur Janick Bernet
Il est presque impossible de faire un non-GC gestionnaire de mémoire de travail dans un environnement multi-CPU environnement, sans exiger de verrouillage être acquis et libéré chaque fois que la mémoire est allouée ou libéré. Chaque verrouillage de l'acquisition ou de la libération aura besoin d'un CPU à coordonner ses actions avec les autres Processeurs, et cette coordination a tendance à être assez cher. Un garbage collection système peut permettre à de nombreux allocations de mémoire pour se produire sans exiger de tous les verrous ou autres inter-PROCESSEUR de coordination. Ceci est un avantage majeur. L'inconvénient est que les nombreuses étapes de la collecte des ordures exiger que le CPU de coordonner leurs actions, et l'obtention de bonnes performances exige généralement que de telles mesures soient consolidés à un niveau important (il n'y a pas beaucoup de bénéfices à l'élimination de l'exigence de la CPU sur la coordination de chaque allocation de mémoire si les Processeurs doivent se coordonner avant chaque étape de la collecte des ordures). Une telle consolidation sont souvent la cause de toutes les tâches dans le système de pause pour différentes longueurs de temps lors de la collecte; en général, plus les pauses que l'on est prêt à accepter, au moins le temps total sera nécessaire pour la collecte.
Si les processeurs étaient de retour à un descripteur basé sur la poignée/le pointeur (système similaire à ce que le 80286 utilisé, bien que de nos jours on ne pas utiliser les segments de 16 bits ou plus), il serait possible pour la collecte des ordures être fait simultanément avec d'autres opérations (si une poignée a été utilisé lors de la GC pour le déplacer, la tâche à l'aide de la poignée devrait être gelé pendant que les données ont été copiées à partir de son ancienne adresse à un nouveau, mais cela ne devrait pas prendre longtemps). Pas sûr que cela n'arrivera jamais, bien que (d'ailleurs, si j'avais tenait qu'à moi, une référence d'objet serait de 32 bits, et un pointeur serait un objet de référence de plus de 32 bits de décalage; je pense que ça va être un certain temps avant il y a un besoin pour plus de 2 milliards d'objets, ou pour tout objet de plus de 4 concerts. En dépit de la Loi de Moore, si une application aurait plus de 2 milliards d'objets, sa performance pourrait être améliorée par l'utilisation de moins de, plus grande, des objets. Si une application aurait besoin d'un objet de plus de 4 concerts, sa performance pourrait être améliorée par l'utilisation de plus petits, des objets.)
"...il serait possible pour la collecte des ordures être fait simultanément avec d'autres opérations". La collecte des ordures est habituellement réalisée simultanément avec d'autres opérations.
Dans une typique "simultané" GC, une grande partie du travail de la GC peut être fait simultanément avec d'autres opérations, mais certains ne le peuvent pas. De plus, essayer d'avoir le GC fonctionner simultanément avec d'autres opérations augmente GC frais généraux, car il doit garder la trace des éléments qui peuvent avoir été modifiés depuis la dernière fois que la GC a examiné. Avoir l'assistance matérielle des descripteurs pour aider à garder la trace des objets qui ont été modifiés pourraient aider sur ces deux points.
Typique GCs ne sont que des "surtout simultané" de sorte qu'ils ne subissent court cessez-le-monde fait une pause, oui. Cependant, quelques tables sont entièrement concurrente de sorte qu'il n'est pas valable pour citer ce que l'inconvénient de la collecte des ordures en général. En particulier, votre affirmation "lors de la collecte des ordures se produit, tout le reste est à l'arrêt jusqu'à ce qu'il complète" n'est pas vrai pour tous les GCs.
OriginalL'auteur supercat
Généralement, la collecte des ordures a certains inconvénients:
"La collecte des ordures consomme des ressources de calcul pour décider de ce mémoire est d'être libéré". Il permet aussi d'économiser des ressources en éliminant tous les appels à
free
."La mémoire est peut-fuite en dépit de la présence d'un garbage collector". Ce n'est pas un inconvénient de la collecte des ordures, pas plus que la prochaine erreur de programmation, il ne vous économiser de.
"Ils peuvent rendre impossible pour un programmeur de raisonner sur les effets sur les performances de choix de conception". Pas vrai.
OriginalL'auteur gsoni