mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 02:54:35 +02:00
6896647: card marks can be deferred too long
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
This commit is contained in:
parent
0917ad432e
commit
331512606a
14 changed files with 107 additions and 54 deletions
|
@ -51,6 +51,9 @@ class CollectedHeap : public CHeapObj {
|
|||
// Used for filler objects (static, but initialized in ctor).
|
||||
static size_t _filler_array_max_size;
|
||||
|
||||
// Used in support of ReduceInitialCardMarks; only consulted if COMPILER2 is being used
|
||||
bool _defer_initial_card_mark;
|
||||
|
||||
protected:
|
||||
MemRegion _reserved;
|
||||
BarrierSet* _barrier_set;
|
||||
|
@ -70,13 +73,16 @@ class CollectedHeap : public CHeapObj {
|
|||
// Constructor
|
||||
CollectedHeap();
|
||||
|
||||
// Do common initializations that must follow instance construction,
|
||||
// for example, those needing virtual calls.
|
||||
// This code could perhaps be moved into initialize() but would
|
||||
// be slightly more awkward because we want the latter to be a
|
||||
// pure virtual.
|
||||
void pre_initialize();
|
||||
|
||||
// Create a new tlab
|
||||
virtual HeapWord* allocate_new_tlab(size_t size);
|
||||
|
||||
// Fix up tlabs to make the heap well-formed again,
|
||||
// optionally retiring the tlabs.
|
||||
virtual void fill_all_tlabs(bool retire);
|
||||
|
||||
// Accumulate statistics on all tlabs.
|
||||
virtual void accumulate_statistics_all_tlabs();
|
||||
|
||||
|
@ -431,14 +437,25 @@ class CollectedHeap : public CHeapObj {
|
|||
// promises to call this function on such a slow-path-allocated
|
||||
// object before performing initializations that have elided
|
||||
// store barriers. Returns new_obj, or maybe a safer copy thereof.
|
||||
virtual oop defer_store_barrier(JavaThread* thread, oop new_obj);
|
||||
virtual oop new_store_pre_barrier(JavaThread* thread, oop new_obj);
|
||||
|
||||
// Answers whether an initializing store to a new object currently
|
||||
// allocated at the given address doesn't need a (deferred) store
|
||||
// allocated at the given address doesn't need a store
|
||||
// barrier. Returns "true" if it doesn't need an initializing
|
||||
// store barrier; answers "false" if it does.
|
||||
virtual bool can_elide_initializing_store_barrier(oop new_obj) = 0;
|
||||
|
||||
// If a compiler is eliding store barriers for TLAB-allocated objects,
|
||||
// we will be informed of a slow-path allocation by a call
|
||||
// to new_store_pre_barrier() above. Such a call precedes the
|
||||
// initialization of the object itself, and no post-store-barriers will
|
||||
// be issued. Some heap types require that the barrier strictly follows
|
||||
// the initializing stores. (This is currently implemented by deferring the
|
||||
// barrier until the next slow-path allocation or gc-related safepoint.)
|
||||
// This interface answers whether a particular heap type needs the card
|
||||
// mark to be thus strictly sequenced after the stores.
|
||||
virtual bool card_mark_must_follow_store() const = 0;
|
||||
|
||||
// If the CollectedHeap was asked to defer a store barrier above,
|
||||
// this informs it to flush such a deferred store barrier to the
|
||||
// remembered set.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue