Mercurial > hg > truffle
comparison src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @ 3746:537a4053b0f9
7042740: CMS: assert(n> q) failed: Looping at: ... blockOffsetTable.cpp:557
Summary: Do a one-step look-ahead, when sweeping free or garbage blocks, to avoid overstepping sweep limit, which may become a non-block-boundary because of a heap expansion delta coalescing with a previously co-terminal free block.
Reviewed-by: brutisso, tonyp
author | ysr |
---|---|
date | Mon, 23 May 2011 16:42:14 -0700 |
parents | 78542e2b5e35 |
children | 41e6ee74f879 |
comparison
equal
deleted
inserted
replaced
3397:cfbca4d74a61 | 3746:537a4053b0f9 |
---|---|
1699 // _freeFinger is the address of the current LHC | 1699 // _freeFinger is the address of the current LHC |
1700 class SweepClosure: public BlkClosureCareful { | 1700 class SweepClosure: public BlkClosureCareful { |
1701 CMSCollector* _collector; // collector doing the work | 1701 CMSCollector* _collector; // collector doing the work |
1702 ConcurrentMarkSweepGeneration* _g; // Generation being swept | 1702 ConcurrentMarkSweepGeneration* _g; // Generation being swept |
1703 CompactibleFreeListSpace* _sp; // Space being swept | 1703 CompactibleFreeListSpace* _sp; // Space being swept |
1704 HeapWord* _limit;// the address at which the sweep should stop because | 1704 HeapWord* _limit;// the address at or above which the sweep should stop |
1705 // we do not expect blocks eligible for sweeping past | 1705 // because we do not expect newly garbage blocks |
1706 // that address. | 1706 // eligible for sweeping past that address. |
1707 Mutex* _freelistLock; // Free list lock (in space) | 1707 Mutex* _freelistLock; // Free list lock (in space) |
1708 CMSBitMap* _bitMap; // Marking bit map (in | 1708 CMSBitMap* _bitMap; // Marking bit map (in |
1709 // generation) | 1709 // generation) |
1710 bool _inFreeRange; // Indicates if we are in the | 1710 bool _inFreeRange; // Indicates if we are in the |
1711 // midst of a free run | 1711 // midst of a free run |
1748 // Code that is common to a free chunk or garbage when | 1748 // Code that is common to a free chunk or garbage when |
1749 // encountered during sweeping. | 1749 // encountered during sweeping. |
1750 void do_post_free_or_garbage_chunk(FreeChunk *fc, size_t chunkSize); | 1750 void do_post_free_or_garbage_chunk(FreeChunk *fc, size_t chunkSize); |
1751 // Process a free chunk during sweeping. | 1751 // Process a free chunk during sweeping. |
1752 void do_already_free_chunk(FreeChunk *fc); | 1752 void do_already_free_chunk(FreeChunk *fc); |
1753 // Work method called when processing an already free or a | |
1754 // freshly garbage chunk to do a lookahead and possibly a | |
1755 // premptive flush if crossing over _limit. | |
1756 void lookahead_and_flush(FreeChunk* fc, size_t chunkSize); | |
1753 // Process a garbage chunk during sweeping. | 1757 // Process a garbage chunk during sweeping. |
1754 size_t do_garbage_chunk(FreeChunk *fc); | 1758 size_t do_garbage_chunk(FreeChunk *fc); |
1755 // Process a live chunk during sweeping. | 1759 // Process a live chunk during sweeping. |
1756 size_t do_live_chunk(FreeChunk* fc); | 1760 size_t do_live_chunk(FreeChunk* fc); |
1757 | 1761 |
1758 // Accessors. | 1762 // Accessors. |
1759 HeapWord* freeFinger() const { return _freeFinger; } | 1763 HeapWord* freeFinger() const { return _freeFinger; } |
1760 void set_freeFinger(HeapWord* v) { _freeFinger = v; } | 1764 void set_freeFinger(HeapWord* v) { _freeFinger = v; } |
1761 size_t freeRangeSize() const { return _freeRangeSize; } | |
1762 void set_freeRangeSize(size_t v) { _freeRangeSize = v; } | |
1763 bool inFreeRange() const { return _inFreeRange; } | 1765 bool inFreeRange() const { return _inFreeRange; } |
1764 void set_inFreeRange(bool v) { _inFreeRange = v; } | 1766 void set_inFreeRange(bool v) { _inFreeRange = v; } |
1765 bool lastFreeRangeCoalesced() const { return _lastFreeRangeCoalesced; } | 1767 bool lastFreeRangeCoalesced() const { return _lastFreeRangeCoalesced; } |
1766 void set_lastFreeRangeCoalesced(bool v) { _lastFreeRangeCoalesced = v; } | 1768 void set_lastFreeRangeCoalesced(bool v) { _lastFreeRangeCoalesced = v; } |
1767 bool freeRangeInFreeLists() const { return _freeRangeInFreeLists; } | 1769 bool freeRangeInFreeLists() const { return _freeRangeInFreeLists; } |
1777 | 1779 |
1778 // Yield | 1780 // Yield |
1779 void do_yield_work(HeapWord* addr); | 1781 void do_yield_work(HeapWord* addr); |
1780 | 1782 |
1781 // Debugging/Printing | 1783 // Debugging/Printing |
1782 void record_free_block_coalesced(FreeChunk* fc) const PRODUCT_RETURN; | 1784 void print_free_block_coalesced(FreeChunk* fc) const; |
1783 | 1785 |
1784 public: | 1786 public: |
1785 SweepClosure(CMSCollector* collector, ConcurrentMarkSweepGeneration* g, | 1787 SweepClosure(CMSCollector* collector, ConcurrentMarkSweepGeneration* g, |
1786 CMSBitMap* bitMap, bool should_yield); | 1788 CMSBitMap* bitMap, bool should_yield); |
1787 ~SweepClosure(); | 1789 ~SweepClosure() PRODUCT_RETURN; |
1788 | 1790 |
1789 size_t do_blk_careful(HeapWord* addr); | 1791 size_t do_blk_careful(HeapWord* addr); |
1792 void print() const { print_on(tty); } | |
1793 void print_on(outputStream *st) const; | |
1790 }; | 1794 }; |
1791 | 1795 |
1792 // Closures related to weak references processing | 1796 // Closures related to weak references processing |
1793 | 1797 |
1794 // During CMS' weak reference processing, this is a | 1798 // During CMS' weak reference processing, this is a |