--- old/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp 2014-11-19 16:45:20.219151054 +0100 +++ new/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp 2014-11-19 16:45:20.071145025 +0100 @@ -90,7 +90,8 @@ CMSRescanMultiple), _marking_task_size(CardTableModRefBS::card_size_in_words * BitsPerWord * CMSConcMarkMultiple), - _collector(NULL) + _collector(NULL), + _preconsumptionDirtyCardClosure(NULL) { assert(sizeof(FreeChunk) / BytesPerWord <= MinChunkSize, "FreeChunk is larger than expected"); --- old/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp 2014-11-19 16:45:21.015183474 +0100 +++ new/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp 2014-11-19 16:45:20.883178099 +0100 @@ -155,6 +155,9 @@ // Used to keep track of limit of sweep for the space HeapWord* _sweep_limit; + // Used to make the young collector update the mod union table + MemRegionClosure* _preconsumptionDirtyCardClosure; + // Support for compacting cms HeapWord* cross_threshold(HeapWord* start, HeapWord* end); HeapWord* forward(oop q, size_t size, CompactPoint* cp, HeapWord* compact_top); @@ -356,6 +359,14 @@ void initialize_sequential_subtasks_for_marking(int n_threads, HeapWord* low = NULL); + virtual MemRegionClosure* preconsumptionDirtyCardClosure() const { + return _preconsumptionDirtyCardClosure; + } + + void setPreconsumptionDirtyCardClosure(MemRegionClosure* cl) { + _preconsumptionDirtyCardClosure = cl; + } + // Space enquiries size_t used() const; size_t free() const; --- old/src/share/vm/memory/space.hpp 2014-11-19 16:45:21.735212801 +0100 +++ new/src/share/vm/memory/space.hpp 2014-11-19 16:45:21.623208238 +0100 @@ -70,15 +70,13 @@ // Used in support of save_marks() HeapWord* _saved_mark_word; - MemRegionClosure* _preconsumptionDirtyCardClosure; - // A sequential tasks done structure. This supports // parallel GC, where we have threads dynamically // claiming sub-tasks from a larger parallel task. SequentialSubTasksDone _par_seq_tasks; Space(): - _bottom(NULL), _end(NULL), _preconsumptionDirtyCardClosure(NULL) { } + _bottom(NULL), _end(NULL) { } public: // Accessors @@ -97,11 +95,8 @@ return (HeapWord*)obj >= saved_mark_word(); } - MemRegionClosure* preconsumptionDirtyCardClosure() const { - return _preconsumptionDirtyCardClosure; - } - void setPreconsumptionDirtyCardClosure(MemRegionClosure* cl) { - _preconsumptionDirtyCardClosure = cl; + virtual MemRegionClosure* preconsumptionDirtyCardClosure() const { + return NULL; } // Returns a subregion of the space containing only the allocated objects in