62 votes

.Net vs Java Garbage Collector

Est-ce que quelqu'un connaît les différences majeures entre les éboueurs Java et .Net? Une recherche sur le Web n'a pas révélé grand chose, et c'est une question qui a été soulevée lors d'un test.

110voto

ShuggyCoUk Points 24204

La différence est entre le CLR (.Net) GC et la JVM GC plutôt que les langues elles-mêmes. Les deux sont sujettes à changement et à la spécification de leur comportement lâche pour permettre que cela soit changé sans que cela n'affecte l'exactitude des programmes.

Il y a quelques différences historiques en grande partie en raison de .Net cours avec des leçons de l'évolution de la java (et d'autres gc en fonction des plates-formes). Dans la suite de ne pas présumer que les .Net a été en quelque sorte supérieure, car il inclut des fonctionnalités dès le début, il est simplement le résultat de venir plus tard.

Un notable publiquement différence visible est que le MS GC expose ses générationnelle de la nature (via le GC api) il est probable que cela reste vrai pour un certain temps puisque c'est une approche évidente à prendre en fonction du comportement que la plupart des programmes de l'exposition: la Plupart des allocations sont extrêmement courte durée.

Initiale de la JVM n'a pas de générations éboueurs bien que cette fonctionnalité a rapidement été ajouté. Les premières générations de collectionneurs mis en œuvre par Sund'Oracle et d'autres ont tendance à être de Marque et de Balayage. Il a été réalisé qu'un mark-sweep-compact approche conduirait à beaucoup mieux localité de mémoire justifier le supplément de la copie de frais généraux. Le common language runtime, runtime a fait ses débuts avec ce comportement.

La différence entre Sun, Oracle et Microsoft GC de mise en œuvre "philosophie" est l'un de configurabilité.

Le soleils'fournit un grand nombre d'options (en ligne de commande) à des réglages aspects de la GC ou le basculer entre les différents modes. De nombreuses options sont de l'-X ou -XX pour indiquer leur manque de soutien, à travers différentes versions ou des fournisseurs. Le CLR en revanche fournit à côté de pas de configuration; votre seule option est l'utilisation du serveur ou du client collectionneurs, pour optimiser le débit des versets de la latence, respectivement.

Des recherches actives en GC stratégies en cours dans les deux sociétés (et open source implémentations) les approches actuelles utilisées dans les plus récents GC implémentations sont par fil eden domaines (amélioration de la localité et de permettre à la collection eden à potentiellement ne pas provoquer une pleine pause) ainsi que de pré-tenuring approches, essayez d'éviter de placer certaines attributions dans l'eden génération.

31voto

Brian Rasmussen Points 68853

C'est juste pour ajouter à ShuggyCoUk excellente réponse. L' .NET GC utilise aussi ce qui est connu comme le gros tas d'objets (LOH). Le CLR preallocates un tas d'objets sur la liturgie des heures et de l'utilisateur tous les objets alloués au moins 85000 octets sont attribués sur la liturgie des heures. En outre, double[] de 1000 éléments ou plus sont attribués sur la liturgie des heures aussi bien en raison de certains d'optimisation interne.

La liturgie des heures est traitée différemment de la génération des tas de différentes manières:

  • C'est seulement nettoyés pendant une pleine recueillir et il n'est jamais compacté comme la génération des tas.
  • Répartition de la liturgie des heures est effectuée par l'intermédiaire d'une liste libre comme malloc est gérée dans le runtime C, alors que les allocations à partir de la génération de tas est essentiellement fait par le simple fait de déplacer un pointeur dans la génération 0.

Je ne sais pas si la JVM a quelque chose de similaire, mais il est essentiel de l'information sur la façon dont la mémoire est gérée dans .NET donc j'espère que vous le trouverez utile.

20voto

Jason Baker Points 56682

Si je me souviens bien, la JVM ne libère pas la mémoire désallouée dans le système d'exploitation comme le fait le CLR.

3voto

duffymo Points 188155

Java 5 introduit beaucoup de changements dans ses algorithmes de GC.

Je ne suis pas un C# maven, mais ces deux articles me font croire que les deux ont évolué de la simple marque et de balayage et vers les nouveaux modèles de la génération:

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html http://www.csharphelp.com/archives2/archive297.html

1voto

tobsen Points 3776

J'ai trouvé ceci:

Dans la plate-forme J2SE version 1.4.2, il y avait quatre ramasseurs d'ordures à partir de laquelle choisir, mais sans explicitement le choix par l'utilisateur de la série garbage collector a toujours été choisi. Dans la version 5.0, le choix du collecteur est basé sur la classe de la machine sur laquelle l'application est démarrée.

ici, et ce

Aussi juste que la JVM gère la destruction d'objets de même ne le CLR par l'intermédiaire d'une Marque et Compacte, la collecte des ordures algorithme

ici

J'espère que cela aide...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X