comparison src/share/vm/gc_interface/collectedHeap.hpp @ 1166:7b0e9cba0307

6896647: card marks can be deferred too long Summary: Deferred card marks are now flushed during the gc prologue. Parallel[Scavege,OldGC] and SerialGC no longer defer card marks generated by COMPILER2 as a result of ReduceInitialCardMarks. For these cases, introduced a diagnostic option to defer the card marks, only for the purposes of testing and diagnostics. CMS and G1 continue to defer card marks. Potential performance concern related to single-threaded flushing of deferred card marks in the gc prologue will be addressed in the future. Reviewed-by: never, johnc
author ysr
date Wed, 13 Jan 2010 15:26:39 -0800
parents 2dd52dea6d28
children 0bfd3fb24150
comparison
equal deleted inserted replaced
1165:2dd52dea6d28 1166:7b0e9cba0307
49 #endif 49 #endif
50 50
51 // Used for filler objects (static, but initialized in ctor). 51 // Used for filler objects (static, but initialized in ctor).
52 static size_t _filler_array_max_size; 52 static size_t _filler_array_max_size;
53 53
54 // Used in support of ReduceInitialCardMarks; only consulted if COMPILER2 is being used
55 bool _defer_initial_card_mark;
56
54 protected: 57 protected:
55 MemRegion _reserved; 58 MemRegion _reserved;
56 BarrierSet* _barrier_set; 59 BarrierSet* _barrier_set;
57 bool _is_gc_active; 60 bool _is_gc_active;
58 unsigned int _total_collections; // ... started 61 unsigned int _total_collections; // ... started
68 PerfStringVariable* _perf_gc_lastcause; 71 PerfStringVariable* _perf_gc_lastcause;
69 72
70 // Constructor 73 // Constructor
71 CollectedHeap(); 74 CollectedHeap();
72 75
76 // Do common initializations that must follow instance construction,
77 // for example, those needing virtual calls.
78 // This code could perhaps be moved into initialize() but would
79 // be slightly more awkward because we want the latter to be a
80 // pure virtual.
81 void pre_initialize();
82
73 // Create a new tlab 83 // Create a new tlab
74 virtual HeapWord* allocate_new_tlab(size_t size); 84 virtual HeapWord* allocate_new_tlab(size_t size);
75
76 // Fix up tlabs to make the heap well-formed again,
77 // optionally retiring the tlabs.
78 virtual void fill_all_tlabs(bool retire);
79 85
80 // Accumulate statistics on all tlabs. 86 // Accumulate statistics on all tlabs.
81 virtual void accumulate_statistics_all_tlabs(); 87 virtual void accumulate_statistics_all_tlabs();
82 88
83 // Reinitialize tlabs before resuming mutators. 89 // Reinitialize tlabs before resuming mutators.
429 // there is probably a corresponding slow path which can produce 435 // there is probably a corresponding slow path which can produce
430 // an object allocated anywhere. The compiler's runtime support 436 // an object allocated anywhere. The compiler's runtime support
431 // promises to call this function on such a slow-path-allocated 437 // promises to call this function on such a slow-path-allocated
432 // object before performing initializations that have elided 438 // object before performing initializations that have elided
433 // store barriers. Returns new_obj, or maybe a safer copy thereof. 439 // store barriers. Returns new_obj, or maybe a safer copy thereof.
434 virtual oop defer_store_barrier(JavaThread* thread, oop new_obj); 440 virtual oop new_store_pre_barrier(JavaThread* thread, oop new_obj);
435 441
436 // Answers whether an initializing store to a new object currently 442 // Answers whether an initializing store to a new object currently
437 // allocated at the given address doesn't need a (deferred) store 443 // allocated at the given address doesn't need a store
438 // barrier. Returns "true" if it doesn't need an initializing 444 // barrier. Returns "true" if it doesn't need an initializing
439 // store barrier; answers "false" if it does. 445 // store barrier; answers "false" if it does.
440 virtual bool can_elide_initializing_store_barrier(oop new_obj) = 0; 446 virtual bool can_elide_initializing_store_barrier(oop new_obj) = 0;
447
448 // If a compiler is eliding store barriers for TLAB-allocated objects,
449 // we will be informed of a slow-path allocation by a call
450 // to new_store_pre_barrier() above. Such a call precedes the
451 // initialization of the object itself, and no post-store-barriers will
452 // be issued. Some heap types require that the barrier strictly follows
453 // the initializing stores. (This is currently implemented by deferring the
454 // barrier until the next slow-path allocation or gc-related safepoint.)
455 // This interface answers whether a particular heap type needs the card
456 // mark to be thus strictly sequenced after the stores.
457 virtual bool card_mark_must_follow_store() const = 0;
441 458
442 // If the CollectedHeap was asked to defer a store barrier above, 459 // If the CollectedHeap was asked to defer a store barrier above,
443 // this informs it to flush such a deferred store barrier to the 460 // this informs it to flush such a deferred store barrier to the
444 // remembered set. 461 // remembered set.
445 virtual void flush_deferred_store_barrier(JavaThread* thread); 462 virtual void flush_deferred_store_barrier(JavaThread* thread);