Chromium Code Reviews| Index: src/mark-compact.h |
| =================================================================== |
| --- src/mark-compact.h (revision 1129) |
| +++ src/mark-compact.h (working copy) |
| @@ -44,12 +44,12 @@ |
| class MarkingVisitor; |
| -// ---------------------------------------------------------------------------- |
| +// ------------------------------------------------------------------------- |
| // Mark-Compact collector |
| // |
| // All methods are static. |
| -class MarkCompactCollector : public AllStatic { |
| +class MarkCompactCollector: public AllStatic { |
| public: |
| // Type of functions to compute forwarding addresses of objects in |
| // compacted spaces. Given an object and its size, return a (non-failure) |
| @@ -127,22 +127,19 @@ |
| // choosing spaces to compact. |
| static void Prepare(); |
| - // Finishes GC, performs heap verification. |
| + // Finishes GC, performs heap verification if enabled. |
| static void Finish(); |
| - // -------------------------------------------------------------------------- |
| - // Phase 1: functions related to marking phase. |
| - // before: Heap is in normal state, collector is 'IDLE'. |
| + // ----------------------------------------------------------------------- |
| + // Phase 1: Marking live objects. |
| // |
| - // The first word of a page in old spaces has the end of |
| - // allocation address of the page. |
| + // Before: The heap has been prepared for garbage collection by |
| + // MarkCompactCollector::Prepare() and is otherwise in its |
| + // normal state. |
| // |
| - // The word at Chunk::high_ address has the address of the |
| - // first page in the next chunk. (The address is tagged to |
| - // distinguish it from end-of-allocation address). |
| - // |
| - // after: live objects are marked. |
| + // After: Live objects are marked and non-live objects are unmarked. |
| + |
| friend class RootMarkingVisitor; |
| friend class MarkingVisitor; |
| @@ -206,7 +203,6 @@ |
| #ifdef DEBUG |
| static void UpdateLiveObjectCount(HeapObject* obj); |
| - static void VerifyHeapAfterMarkingPhase(); |
| #endif |
| // We sweep the large object space in the same way whether we are |
| @@ -216,30 +212,50 @@ |
| // Test whether a (possibly marked) object is a Map. |
| static inline bool SafeIsMap(HeapObject* object); |
| - // Map transitions from a live map to a dead map must be killed. |
| + // Map transitions from a live map to a dead map must be killed. |
| // We replace them with a null descriptor, with the same key. |
| static void ClearNonLiveTransitions(); |
| - // -------------------------------------------------------------------------- |
| - // Phase 2: functions related to computing and encoding forwarding pointers |
| - // before: live objects' map pointers are marked as '00' |
| - // after: Map pointers of live old and map objects have encoded |
| - // forwarding pointers and map pointers |
| + // ----------------------------------------------------------------------- |
| + // Phase 2: Sweeping to clear mark bits and free non-live objects for |
| + // a non-compacting collection, or else computing and encoding |
| + // forwarding addresses for a compacting collection. |
| // |
| - // The 3rd word of a page has the page top offset after compaction. |
| + // Before: Live objects are marked and non-live objects are unmarked. |
| // |
| - // The 4th word of a page in the map space has the map index |
| - // of this page in the map table. This word is not used in |
| - // the old space. |
| + // After: (Non-compacting collection.) Live objects are unmarked, |
| + // non-live regions have been added to their space's free |
| + // list. |
| // |
| - // The 5th and 6th words of a page have the start and end |
| - // addresses of the first free region in the page. |
| + // After: (Compacting collection.) The forwarding address of live |
| + // objects in the paged spaces is encoded in their map word |
| + // along with their (non-forwarded) map pointer. |
| // |
| - // The 7th word of a page in old spaces has the forwarding address |
| - // of the first live object in the page. |
| + // The forwarding address of live objects in the new space is |
| + // written to their map word's offset in the inactive |
| + // semispace. |
| // |
| - // Live young objects have their forwarding pointers in |
| - // the from space at the same offset to the beginning of the space. |
| + // Bookkeeping data is written to the remembered-set are of |
|
Mads Ager (chromium)
2009/01/22 18:37:23
are of eached -> of each
|
| + // eached paged-space page that contains live objects after |
| + // compaction: |
| + // |
| + // The 3rd word of the page (first word of the remembered |
| + // set) contains the relocation top address, the address of |
| + // the first word after the end of the last live object in |
| + // the page after compaction. |
| + // |
| + // The 4th word contains the zero-based index of the page in |
| + // its space. This word is only used for map space pages, in |
| + // order to encode the map addresses in 21 bits to free 11 |
| + // bits per map word for the forwarding address. |
| + // |
| + // The 5th word contains the (nonencoded) forwarding address |
| + // of the first live object in the page. |
| + // |
| + // In both the new space and the paged spaces, a linked list |
| + // of live regions is constructructed (linked through |
| + // pointers in the non-live region immediately following each |
| + // live region) to speed further passes of the collector. |
| // Encodes forwarding addresses of objects in compactable parts of the |
| // heap. |
| @@ -272,20 +288,22 @@ |
| static void DeallocateCodeBlock(Address start, int size_in_bytes); |
| static void DeallocateMapBlock(Address start, int size_in_bytes); |
| - // Phase 2: If we are not compacting the heap, we simply sweep the spaces |
| - // except for the large object space, clearing mark bits and adding |
| - // unmarked regions to each space's free list. |
| + // If we are not compacting the heap, we simply sweep the spaces except |
| + // for the large object space, clearing mark bits and adding unmarked |
| + // regions to each space's free list. |
| static void SweepSpaces(); |
| -#ifdef DEBUG |
| - static void VerifyHeapAfterEncodingForwardingAddresses(); |
| -#endif |
| + // ----------------------------------------------------------------------- |
| + // Phase 3: Updating pointers in live objects. |
| + // |
| + // Before: Same as after phase 2 (compacting collection). |
| + // |
| + // After: All pointers in live objects, including encoded map |
| + // pointers, are updated to point to their target's new |
| + // location. The remembered set area of each paged-space |
| + // page containing live objects still contains bookkeeping |
| + // information. |
| - // -------------------------------------------------------------------------- |
| - // Phase 3: function related to updating pointers and decode map pointers |
| - // before: see after phase 2 |
| - // after: all pointers are updated to forwarding addresses. |
| - |
| friend class UpdatingVisitor; // helper for updating visited objects |
| // Updates pointers in all spaces. |
| @@ -302,15 +320,18 @@ |
| // Calculates the forwarding address of an object in an old space. |
| static Address GetForwardingAddressInOldSpace(HeapObject* obj); |
| -#ifdef DEBUG |
| - static void VerifyHeapAfterUpdatingPointers(); |
| -#endif |
| + // ----------------------------------------------------------------------- |
| + // Phase 4: Relocating objects. |
| + // |
| + // Before: Pointers to live objects are updated to point to their |
| + // target's new location. The remembered set area of each |
| + // paged-space page containing live objects still contains |
| + // bookkeeping information. |
| + // |
| + // After: Objects have been moved to their new addresses. The |
| + // remembered set area of each paged-space page containing |
| + // live objects still contains bookkeeping information. |
| - // -------------------------------------------------------------------------- |
| - // Phase 4: functions related to relocating objects |
| - // before: see after phase 3 |
| - // after: heap is in a normal state, except remembered set is not built |
| - |
| // Relocates objects in all spaces. |
| static void RelocateObjects(); |
| @@ -334,18 +355,19 @@ |
| // Copy a new object. |
| static int RelocateNewObject(HeapObject* obj); |
| -#ifdef DEBUG |
| - static void VerifyHeapAfterRelocatingObjects(); |
| -#endif |
| + // ----------------------------------------------------------------------- |
| + // Phase 5: Rebuilding remembered sets. |
| + // |
| + // Before: The heap is in a normal state except that remembered sets |
| + // in the paged spaces are not correct. |
| + // |
| + // After: The heap is in a normal state. |
| - // --------------------------------------------------------------------------- |
| - // Phase 5: functions related to rebuilding remembered sets |
| - |
| // Rebuild remembered set in old and map spaces. |
| static void RebuildRSets(); |
| #ifdef DEBUG |
| - // --------------------------------------------------------------------------- |
| + // ----------------------------------------------------------------------- |
| // Debugging variables, functions and classes |
| // Counters used for debugging the marking phase of mark-compact or |
| // mark-sweep collection. |
| @@ -371,12 +393,6 @@ |
| // Number of live bytes in this collection. |
| static int live_bytes_; |
| - static void VerifyPageHeaders(PagedSpace* space); |
| - |
| - // Verification functions when relocating objects. |
| - friend class VerifyCopyingVisitor; |
| - static void VerifyCopyingObjects(Object** p); |
| - |
| friend class MarkObjectVisitor; |
| static void VisitObject(HeapObject* obj); |