2010-09-20 6 views
1

Cette question fait suite à ma précédente question Java GC: Java Garbage Collector clarificationJava GC Arrêtez et copiez

Cette question se réfère également au même article.

Je suis un peu confus sur pourquoi la méthode stop and copy pour défragmenter l'allocation de tas d'objets est si couramment utilisée. Oui, il défragmente le tas, mais il semble qu'il y a des tonnes de frais généraux parce que, fondamentalement, vous réduisez la quantité totale de la taille du tas de moitié. De plus, vous devez copier TOUS les objets en direct lorsque la moitié de l'espace est insuffisant.

À part la défragmentation, y a-t-il une autre raison fondamentale pour laquelle «stop and copy» est mieux que «mark and sweep»?

+3

Vous vous rendez compte que cet article date de 1996 et que le monde a beaucoup évolué depuis? Jetez un coup d'œil sur les documents de Sun Hotspot, en particulier sur «l'optimisation de la collecte des ordures», pour voir où en sont les choses aujourd'hui (je n'ai pas de lien pratique, mais Google le fait). – Anon

+0

La défragmentation ne réduit pas nécessairement la taille totale du tas de moitié. Certaines implémentations peuvent le faire. De plus, il ne copie pas nécessairement tous les objets vivants. –

+0

Ok donc je viens de googler 'tuning garbage collection' mais je ne comprends pas vraiment le mécanisme? Quelqu'un pourrait-il donner une explication rapide? – Albinoswordfish

Répondre

4

En fait, la fragmentation est fondamentale, et la capacité de certains GC à la vaincre est un atout considérable.

L'algorithme stop-and-copie utilisé pour être populaires dans les implémentations de GC car:

  1. il est simple à mettre en œuvre;
  2. il défragmente automatiquement la mémoire;
  3. son temps d'exécution est proportionnel à la quantité de vivants objets, ce qui le rend asymptotiquement très efficace.

Plus GC moderne, y compris ceux qui sont utilisés en Java, utiliser des stratégies beaucoup plus complexes parce qu'ils veulent faire courtes pauses (plutôt que de faire le temps total de GC faible, ils préfèrent ne jamais arrêter l'application depuis longtemps , parce que les pauses sont mauvaises pour l'interactivité), pour interagir plus proprement avec les caches et la mémoire virtuelle, et pour bénéficier des systèmes avec plusieurs CPU.

Le Jones and Lins book est un must-read pour quiconque veut comprendre la collecte des ordures.

1

Un excellent tutoriel sur le garbage collector est Tuning Garbage Collection (malheureusement, le nouveau site web d'Oracle a beaucoup désordonné son formatage).

Votre question est traitée au chapitre V. Elle explique en gros quels types de stratégies vous pouvez utiliser dans le garbage collector Java et quelles sont les stratégies par défaut. La plupart des applications de bureau seront intéressées par un arrêt aussi petit que possible, car c'est ce que l'utilisateur peut remarquer.

Notez que votre question ne concerne pas la défragmentation. Les deux vont éventuellement compresser l'espace mémoire.

Questions connexes