mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-26 22:34:27 +02:00
7111795: G1: Various cleanups identified during walk through of changes for 6484965
Various cleanups and formatting changes identified during a code walk through of the changes for 6484965 ("G1: piggy-back liveness accounting phase on marking"). Reviewed-by: brutisso, tonyp
This commit is contained in:
parent
6d0e0064bf
commit
a03f061ca2
2 changed files with 51 additions and 70 deletions
|
@ -44,7 +44,7 @@
|
||||||
//
|
//
|
||||||
// CMS Bit Map Wrapper
|
// CMS Bit Map Wrapper
|
||||||
|
|
||||||
CMBitMapRO::CMBitMapRO(ReservedSpace rs, int shifter):
|
CMBitMapRO::CMBitMapRO(ReservedSpace rs, int shifter) :
|
||||||
_bm((uintptr_t*)NULL,0),
|
_bm((uintptr_t*)NULL,0),
|
||||||
_shifter(shifter) {
|
_shifter(shifter) {
|
||||||
_bmStartWord = (HeapWord*)(rs.base());
|
_bmStartWord = (HeapWord*)(rs.base());
|
||||||
|
@ -1530,10 +1530,42 @@ public:
|
||||||
FreeRegionList* local_cleanup_list,
|
FreeRegionList* local_cleanup_list,
|
||||||
OldRegionSet* old_proxy_set,
|
OldRegionSet* old_proxy_set,
|
||||||
HumongousRegionSet* humongous_proxy_set,
|
HumongousRegionSet* humongous_proxy_set,
|
||||||
HRRSCleanupTask* hrrs_cleanup_task);
|
HRRSCleanupTask* hrrs_cleanup_task) :
|
||||||
|
_g1(g1), _worker_num(worker_num),
|
||||||
|
_max_live_bytes(0), _regions_claimed(0),
|
||||||
|
_freed_bytes(0),
|
||||||
|
_claimed_region_time(0.0), _max_region_time(0.0),
|
||||||
|
_local_cleanup_list(local_cleanup_list),
|
||||||
|
_old_proxy_set(old_proxy_set),
|
||||||
|
_humongous_proxy_set(humongous_proxy_set),
|
||||||
|
_hrrs_cleanup_task(hrrs_cleanup_task) { }
|
||||||
|
|
||||||
size_t freed_bytes() { return _freed_bytes; }
|
size_t freed_bytes() { return _freed_bytes; }
|
||||||
|
|
||||||
bool doHeapRegion(HeapRegion *r);
|
bool doHeapRegion(HeapRegion *hr) {
|
||||||
|
// We use a claim value of zero here because all regions
|
||||||
|
// were claimed with value 1 in the FinalCount task.
|
||||||
|
hr->reset_gc_time_stamp();
|
||||||
|
if (!hr->continuesHumongous()) {
|
||||||
|
double start = os::elapsedTime();
|
||||||
|
_regions_claimed++;
|
||||||
|
hr->note_end_of_marking();
|
||||||
|
_max_live_bytes += hr->max_live_bytes();
|
||||||
|
_g1->free_region_if_empty(hr,
|
||||||
|
&_freed_bytes,
|
||||||
|
_local_cleanup_list,
|
||||||
|
_old_proxy_set,
|
||||||
|
_humongous_proxy_set,
|
||||||
|
_hrrs_cleanup_task,
|
||||||
|
true /* par */);
|
||||||
|
double region_time = (os::elapsedTime() - start);
|
||||||
|
_claimed_region_time += region_time;
|
||||||
|
if (region_time > _max_region_time) {
|
||||||
|
_max_region_time = region_time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
size_t max_live_bytes() { return _max_live_bytes; }
|
size_t max_live_bytes() { return _max_live_bytes; }
|
||||||
size_t regions_claimed() { return _regions_claimed; }
|
size_t regions_claimed() { return _regions_claimed; }
|
||||||
|
@ -1644,47 +1676,6 @@ public:
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
G1NoteEndOfConcMarkClosure::
|
|
||||||
G1NoteEndOfConcMarkClosure(G1CollectedHeap* g1,
|
|
||||||
int worker_num,
|
|
||||||
FreeRegionList* local_cleanup_list,
|
|
||||||
OldRegionSet* old_proxy_set,
|
|
||||||
HumongousRegionSet* humongous_proxy_set,
|
|
||||||
HRRSCleanupTask* hrrs_cleanup_task)
|
|
||||||
: _g1(g1), _worker_num(worker_num),
|
|
||||||
_max_live_bytes(0), _regions_claimed(0),
|
|
||||||
_freed_bytes(0),
|
|
||||||
_claimed_region_time(0.0), _max_region_time(0.0),
|
|
||||||
_local_cleanup_list(local_cleanup_list),
|
|
||||||
_old_proxy_set(old_proxy_set),
|
|
||||||
_humongous_proxy_set(humongous_proxy_set),
|
|
||||||
_hrrs_cleanup_task(hrrs_cleanup_task) { }
|
|
||||||
|
|
||||||
bool G1NoteEndOfConcMarkClosure::doHeapRegion(HeapRegion *hr) {
|
|
||||||
// We use a claim value of zero here because all regions
|
|
||||||
// were claimed with value 1 in the FinalCount task.
|
|
||||||
hr->reset_gc_time_stamp();
|
|
||||||
if (!hr->continuesHumongous()) {
|
|
||||||
double start = os::elapsedTime();
|
|
||||||
_regions_claimed++;
|
|
||||||
hr->note_end_of_marking();
|
|
||||||
_max_live_bytes += hr->max_live_bytes();
|
|
||||||
_g1->free_region_if_empty(hr,
|
|
||||||
&_freed_bytes,
|
|
||||||
_local_cleanup_list,
|
|
||||||
_old_proxy_set,
|
|
||||||
_humongous_proxy_set,
|
|
||||||
_hrrs_cleanup_task,
|
|
||||||
true /* par */);
|
|
||||||
double region_time = (os::elapsedTime() - start);
|
|
||||||
_claimed_region_time += region_time;
|
|
||||||
if (region_time > _max_region_time) {
|
|
||||||
_max_region_time = region_time;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConcurrentMark::cleanup() {
|
void ConcurrentMark::cleanup() {
|
||||||
// world is stopped at this checkpoint
|
// world is stopped at this checkpoint
|
||||||
assert(SafepointSynchronize::is_at_safepoint(),
|
assert(SafepointSynchronize::is_at_safepoint(),
|
||||||
|
@ -1991,16 +1982,12 @@ class G1CMDrainMarkingStackClosure: public VoidClosure {
|
||||||
class G1CMParKeepAliveAndDrainClosure: public OopClosure {
|
class G1CMParKeepAliveAndDrainClosure: public OopClosure {
|
||||||
ConcurrentMark* _cm;
|
ConcurrentMark* _cm;
|
||||||
CMTask* _task;
|
CMTask* _task;
|
||||||
CMBitMap* _bitMap;
|
|
||||||
int _ref_counter_limit;
|
int _ref_counter_limit;
|
||||||
int _ref_counter;
|
int _ref_counter;
|
||||||
public:
|
public:
|
||||||
G1CMParKeepAliveAndDrainClosure(ConcurrentMark* cm,
|
G1CMParKeepAliveAndDrainClosure(ConcurrentMark* cm, CMTask* task) :
|
||||||
CMTask* task,
|
_cm(cm), _task(task),
|
||||||
CMBitMap* bitMap) :
|
_ref_counter_limit(G1RefProcDrainInterval) {
|
||||||
_cm(cm), _task(task), _bitMap(bitMap),
|
|
||||||
_ref_counter_limit(G1RefProcDrainInterval)
|
|
||||||
{
|
|
||||||
assert(_ref_counter_limit > 0, "sanity");
|
assert(_ref_counter_limit > 0, "sanity");
|
||||||
_ref_counter = _ref_counter_limit;
|
_ref_counter = _ref_counter_limit;
|
||||||
}
|
}
|
||||||
|
@ -2091,19 +2078,16 @@ class G1CMRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
|
||||||
private:
|
private:
|
||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
ConcurrentMark* _cm;
|
ConcurrentMark* _cm;
|
||||||
CMBitMap* _bitmap;
|
|
||||||
WorkGang* _workers;
|
WorkGang* _workers;
|
||||||
int _active_workers;
|
int _active_workers;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
G1CMRefProcTaskExecutor(G1CollectedHeap* g1h,
|
G1CMRefProcTaskExecutor(G1CollectedHeap* g1h,
|
||||||
ConcurrentMark* cm,
|
ConcurrentMark* cm,
|
||||||
CMBitMap* bitmap,
|
|
||||||
WorkGang* workers,
|
WorkGang* workers,
|
||||||
int n_workers) :
|
int n_workers) :
|
||||||
_g1h(g1h), _cm(cm), _bitmap(bitmap),
|
_g1h(g1h), _cm(cm),
|
||||||
_workers(workers), _active_workers(n_workers)
|
_workers(workers), _active_workers(n_workers) { }
|
||||||
{ }
|
|
||||||
|
|
||||||
// Executes the given task using concurrent marking worker threads.
|
// Executes the given task using concurrent marking worker threads.
|
||||||
virtual void execute(ProcessTask& task);
|
virtual void execute(ProcessTask& task);
|
||||||
|
@ -2115,21 +2099,18 @@ class G1CMRefProcTaskProxy: public AbstractGangTask {
|
||||||
ProcessTask& _proc_task;
|
ProcessTask& _proc_task;
|
||||||
G1CollectedHeap* _g1h;
|
G1CollectedHeap* _g1h;
|
||||||
ConcurrentMark* _cm;
|
ConcurrentMark* _cm;
|
||||||
CMBitMap* _bitmap;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
G1CMRefProcTaskProxy(ProcessTask& proc_task,
|
G1CMRefProcTaskProxy(ProcessTask& proc_task,
|
||||||
G1CollectedHeap* g1h,
|
G1CollectedHeap* g1h,
|
||||||
ConcurrentMark* cm,
|
ConcurrentMark* cm) :
|
||||||
CMBitMap* bitmap) :
|
|
||||||
AbstractGangTask("Process reference objects in parallel"),
|
AbstractGangTask("Process reference objects in parallel"),
|
||||||
_proc_task(proc_task), _g1h(g1h), _cm(cm), _bitmap(bitmap)
|
_proc_task(proc_task), _g1h(g1h), _cm(cm) { }
|
||||||
{}
|
|
||||||
|
|
||||||
virtual void work(int i) {
|
virtual void work(int i) {
|
||||||
CMTask* marking_task = _cm->task(i);
|
CMTask* marking_task = _cm->task(i);
|
||||||
G1CMIsAliveClosure g1_is_alive(_g1h);
|
G1CMIsAliveClosure g1_is_alive(_g1h);
|
||||||
G1CMParKeepAliveAndDrainClosure g1_par_keep_alive(_cm, marking_task, _bitmap);
|
G1CMParKeepAliveAndDrainClosure g1_par_keep_alive(_cm, marking_task);
|
||||||
G1CMParDrainMarkingStackClosure g1_par_drain(_cm, marking_task);
|
G1CMParDrainMarkingStackClosure g1_par_drain(_cm, marking_task);
|
||||||
|
|
||||||
_proc_task.work(i, g1_is_alive, g1_par_keep_alive, g1_par_drain);
|
_proc_task.work(i, g1_is_alive, g1_par_keep_alive, g1_par_drain);
|
||||||
|
@ -2139,7 +2120,7 @@ public:
|
||||||
void G1CMRefProcTaskExecutor::execute(ProcessTask& proc_task) {
|
void G1CMRefProcTaskExecutor::execute(ProcessTask& proc_task) {
|
||||||
assert(_workers != NULL, "Need parallel worker threads.");
|
assert(_workers != NULL, "Need parallel worker threads.");
|
||||||
|
|
||||||
G1CMRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _cm, _bitmap);
|
G1CMRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _cm);
|
||||||
|
|
||||||
// We need to reset the phase for each task execution so that
|
// We need to reset the phase for each task execution so that
|
||||||
// the termination protocol of CMTask::do_marking_step works.
|
// the termination protocol of CMTask::do_marking_step works.
|
||||||
|
@ -2156,8 +2137,7 @@ class G1CMRefEnqueueTaskProxy: public AbstractGangTask {
|
||||||
public:
|
public:
|
||||||
G1CMRefEnqueueTaskProxy(EnqueueTask& enq_task) :
|
G1CMRefEnqueueTaskProxy(EnqueueTask& enq_task) :
|
||||||
AbstractGangTask("Enqueue reference objects in parallel"),
|
AbstractGangTask("Enqueue reference objects in parallel"),
|
||||||
_enq_task(enq_task)
|
_enq_task(enq_task) { }
|
||||||
{ }
|
|
||||||
|
|
||||||
virtual void work(int i) {
|
virtual void work(int i) {
|
||||||
_enq_task.work(i);
|
_enq_task.work(i);
|
||||||
|
@ -2210,7 +2190,7 @@ void ConcurrentMark::weakRefsWork(bool clear_all_soft_refs) {
|
||||||
int active_workers = g1h->workers() ? g1h->workers()->total_workers() : 1;
|
int active_workers = g1h->workers() ? g1h->workers()->total_workers() : 1;
|
||||||
active_workers = MAX2(MIN2(active_workers, (int)_max_task_num), 1);
|
active_workers = MAX2(MIN2(active_workers, (int)_max_task_num), 1);
|
||||||
|
|
||||||
G1CMRefProcTaskExecutor par_task_executor(g1h, this, nextMarkBitMap(),
|
G1CMRefProcTaskExecutor par_task_executor(g1h, this,
|
||||||
g1h->workers(), active_workers);
|
g1h->workers(), active_workers);
|
||||||
|
|
||||||
if (rp->processing_is_mt()) {
|
if (rp->processing_is_mt()) {
|
||||||
|
@ -3064,12 +3044,13 @@ void ConcurrentMark::complete_marking_in_collection_set() {
|
||||||
g1h->collection_set_iterate(&cmplt);
|
g1h->collection_set_iterate(&cmplt);
|
||||||
if (cmplt.completed()) break;
|
if (cmplt.completed()) break;
|
||||||
}
|
}
|
||||||
double end_time = os::elapsedTime();
|
|
||||||
double elapsed_time_ms = (end_time - start) * 1000.0;
|
|
||||||
g1h->g1_policy()->record_mark_closure_time(elapsed_time_ms);
|
|
||||||
|
|
||||||
ClearMarksInHRClosure clr(nextMarkBitMap());
|
ClearMarksInHRClosure clr(nextMarkBitMap());
|
||||||
g1h->collection_set_iterate(&clr);
|
g1h->collection_set_iterate(&clr);
|
||||||
|
|
||||||
|
double end_time = os::elapsedTime();
|
||||||
|
double elapsed_time_ms = (end_time - start) * 1000.0;
|
||||||
|
g1h->g1_policy()->record_mark_closure_time(elapsed_time_ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The next two methods deal with the following optimisation. Some
|
// The next two methods deal with the following optimisation. Some
|
||||||
|
|
|
@ -416,7 +416,7 @@ class HeapRegion: public G1OffsetTableContigSpace {
|
||||||
|
|
||||||
void add_to_marked_bytes(size_t incr_bytes) {
|
void add_to_marked_bytes(size_t incr_bytes) {
|
||||||
_next_marked_bytes = _next_marked_bytes + incr_bytes;
|
_next_marked_bytes = _next_marked_bytes + incr_bytes;
|
||||||
guarantee( _next_marked_bytes <= used(), "invariant" );
|
assert(_next_marked_bytes <= used(), "invariant" );
|
||||||
}
|
}
|
||||||
|
|
||||||
void zero_marked_bytes() {
|
void zero_marked_bytes() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue