mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 19:44:41 +02:00
6962947: shared TaskQueue statistics
Reviewed-by: tonyp, ysr
This commit is contained in:
parent
4efdcb87d1
commit
daf491a814
11 changed files with 236 additions and 137 deletions
|
@ -90,10 +90,7 @@ void PSPromotionManager::pre_scavenge() {
|
|||
}
|
||||
|
||||
void PSPromotionManager::post_scavenge() {
|
||||
#if PS_PM_STATS
|
||||
print_stats();
|
||||
#endif // PS_PM_STATS
|
||||
|
||||
TASKQUEUE_STATS_ONLY(if (PrintGCDetails && ParallelGCVerbose) print_stats());
|
||||
for (uint i = 0; i < ParallelGCThreads + 1; i++) {
|
||||
PSPromotionManager* manager = manager_array(i);
|
||||
if (UseDepthFirstScavengeOrder) {
|
||||
|
@ -105,37 +102,58 @@ void PSPromotionManager::post_scavenge() {
|
|||
}
|
||||
}
|
||||
|
||||
#if PS_PM_STATS
|
||||
#if TASKQUEUE_STATS
|
||||
void
|
||||
PSPromotionManager::print_taskqueue_stats(uint i) const {
|
||||
const TaskQueueStats& stats = depth_first() ?
|
||||
_claimed_stack_depth.stats : _claimed_stack_breadth.stats;
|
||||
tty->print("%3u ", i);
|
||||
stats.print();
|
||||
tty->cr();
|
||||
}
|
||||
|
||||
void
|
||||
PSPromotionManager::print_stats(uint i) {
|
||||
tty->print_cr("---- GC Worker %2d Stats", i);
|
||||
tty->print_cr(" total pushes %8d", _total_pushes);
|
||||
tty->print_cr(" masked pushes %8d", _masked_pushes);
|
||||
tty->print_cr(" overflow pushes %8d", _overflow_pushes);
|
||||
tty->print_cr(" max overflow length %8d", _max_overflow_length);
|
||||
tty->print_cr("");
|
||||
tty->print_cr(" arrays chunked %8d", _arrays_chunked);
|
||||
tty->print_cr(" array chunks processed %8d", _array_chunks_processed);
|
||||
tty->print_cr("");
|
||||
tty->print_cr(" total steals %8d", _total_steals);
|
||||
tty->print_cr(" masked steals %8d", _masked_steals);
|
||||
tty->print_cr("");
|
||||
PSPromotionManager::print_local_stats(uint i) const {
|
||||
#define FMT " " SIZE_FORMAT_W(10)
|
||||
tty->print_cr("%3u" FMT FMT FMT FMT, i, _masked_pushes, _masked_steals,
|
||||
_arrays_chunked, _array_chunks_processed);
|
||||
#undef FMT
|
||||
}
|
||||
|
||||
static const char* const pm_stats_hdr[] = {
|
||||
" --------masked------- arrays array",
|
||||
"thr push steal chunked chunks",
|
||||
"--- ---------- ---------- ---------- ----------"
|
||||
};
|
||||
|
||||
void
|
||||
PSPromotionManager::print_stats() {
|
||||
tty->print_cr("== GC Tasks Stats (%s), GC %3d",
|
||||
(UseDepthFirstScavengeOrder) ? "Depth-First" : "Breadth-First",
|
||||
const bool df = UseDepthFirstScavengeOrder;
|
||||
tty->print_cr("== GC Task Stats (%s-First), GC %3d", df ? "Depth" : "Breadth",
|
||||
Universe::heap()->total_collections());
|
||||
|
||||
for (uint i = 0; i < ParallelGCThreads+1; ++i) {
|
||||
PSPromotionManager* manager = manager_array(i);
|
||||
manager->print_stats(i);
|
||||
tty->print("thr "); TaskQueueStats::print_header(1); tty->cr();
|
||||
tty->print("--- "); TaskQueueStats::print_header(2); tty->cr();
|
||||
for (uint i = 0; i < ParallelGCThreads + 1; ++i) {
|
||||
manager_array(i)->print_taskqueue_stats(i);
|
||||
}
|
||||
|
||||
const uint hlines = sizeof(pm_stats_hdr) / sizeof(pm_stats_hdr[0]);
|
||||
for (uint i = 0; i < hlines; ++i) tty->print_cr(pm_stats_hdr[i]);
|
||||
for (uint i = 0; i < ParallelGCThreads + 1; ++i) {
|
||||
manager_array(i)->print_local_stats(i);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // PS_PM_STATS
|
||||
void
|
||||
PSPromotionManager::reset_stats() {
|
||||
TaskQueueStats& stats = depth_first() ?
|
||||
claimed_stack_depth()->stats : claimed_stack_breadth()->stats;
|
||||
stats.reset();
|
||||
_masked_pushes = _masked_steals = 0;
|
||||
_arrays_chunked = _array_chunks_processed = 0;
|
||||
}
|
||||
#endif // TASKQUEUE_STATS
|
||||
|
||||
PSPromotionManager::PSPromotionManager() {
|
||||
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
|
||||
|
@ -189,16 +207,7 @@ void PSPromotionManager::reset() {
|
|||
|
||||
_prefetch_queue.clear();
|
||||
|
||||
#if PS_PM_STATS
|
||||
_total_pushes = 0;
|
||||
_masked_pushes = 0;
|
||||
_overflow_pushes = 0;
|
||||
_max_overflow_length = 0;
|
||||
_arrays_chunked = 0;
|
||||
_array_chunks_processed = 0;
|
||||
_total_steals = 0;
|
||||
_masked_steals = 0;
|
||||
#endif // PS_PM_STATS
|
||||
TASKQUEUE_STATS_ONLY(reset_stats());
|
||||
}
|
||||
|
||||
|
||||
|
@ -423,14 +432,9 @@ oop PSPromotionManager::copy_to_survivor_space(oop o, bool depth_first) {
|
|||
new_obj->is_objArray() &&
|
||||
PSChunkLargeArrays) {
|
||||
// we'll chunk it
|
||||
#if PS_PM_STATS
|
||||
++_arrays_chunked;
|
||||
#endif // PS_PM_STATS
|
||||
oop* const masked_o = mask_chunked_array_oop(o);
|
||||
push_depth(masked_o);
|
||||
#if PS_PM_STATS
|
||||
++_masked_pushes;
|
||||
#endif // PS_PM_STATS
|
||||
TASKQUEUE_STATS_ONLY(++_arrays_chunked; ++_masked_pushes);
|
||||
} else {
|
||||
// we'll just push its contents
|
||||
new_obj->push_contents(this);
|
||||
|
@ -494,9 +498,7 @@ void PSPromotionManager::process_array_chunk(oop old) {
|
|||
assert(old->is_objArray(), "invariant");
|
||||
assert(old->is_forwarded(), "invariant");
|
||||
|
||||
#if PS_PM_STATS
|
||||
++_array_chunks_processed;
|
||||
#endif // PS_PM_STATS
|
||||
TASKQUEUE_STATS_ONLY(++_array_chunks_processed);
|
||||
|
||||
oop const obj = old->forwardee();
|
||||
|
||||
|
@ -508,9 +510,7 @@ void PSPromotionManager::process_array_chunk(oop old) {
|
|||
assert(start > 0, "invariant");
|
||||
arrayOop(old)->set_length(start);
|
||||
push_depth(mask_chunked_array_oop(old));
|
||||
#if PS_PM_STATS
|
||||
++_masked_pushes;
|
||||
#endif // PS_PM_STATS
|
||||
TASKQUEUE_STATS_ONLY(++_masked_pushes);
|
||||
} else {
|
||||
// this is the final chunk for this array
|
||||
start = 0;
|
||||
|
|
|
@ -42,8 +42,6 @@ class MutableSpace;
|
|||
class PSOldGen;
|
||||
class ParCompactionManager;
|
||||
|
||||
#define PS_PM_STATS 0
|
||||
|
||||
class PSPromotionManager : public CHeapObj {
|
||||
friend class PSScavenge;
|
||||
friend class PSRefProcTaskExecutor;
|
||||
|
@ -54,22 +52,18 @@ class PSPromotionManager : public CHeapObj {
|
|||
static PSOldGen* _old_gen;
|
||||
static MutableSpace* _young_space;
|
||||
|
||||
#if PS_PM_STATS
|
||||
uint _total_pushes;
|
||||
uint _masked_pushes;
|
||||
#if TASKQUEUE_STATS
|
||||
size_t _masked_pushes;
|
||||
size_t _masked_steals;
|
||||
size_t _arrays_chunked;
|
||||
size_t _array_chunks_processed;
|
||||
|
||||
uint _overflow_pushes;
|
||||
uint _max_overflow_length;
|
||||
|
||||
uint _arrays_chunked;
|
||||
uint _array_chunks_processed;
|
||||
|
||||
uint _total_steals;
|
||||
uint _masked_steals;
|
||||
|
||||
void print_stats(uint i);
|
||||
void print_taskqueue_stats(uint i) const;
|
||||
void print_local_stats(uint i) const;
|
||||
static void print_stats();
|
||||
#endif // PS_PM_STATS
|
||||
|
||||
void reset_stats();
|
||||
#endif // TASKQUEUE_STATS
|
||||
|
||||
PSYoungPromotionLAB _young_lab;
|
||||
PSOldPromotionLAB _old_lab;
|
||||
|
@ -143,42 +137,12 @@ class PSPromotionManager : public CHeapObj {
|
|||
|
||||
template <class T> void push_depth(T* p) {
|
||||
assert(depth_first(), "pre-condition");
|
||||
|
||||
#if PS_PM_STATS
|
||||
++_total_pushes;
|
||||
int stack_length = claimed_stack_depth()->overflow_stack()->length();
|
||||
#endif // PS_PM_STATS
|
||||
|
||||
claimed_stack_depth()->push(p);
|
||||
|
||||
#if PS_PM_STATS
|
||||
if (claimed_stack_depth()->overflow_stack()->length() != stack_length) {
|
||||
++_overflow_pushes;
|
||||
if ((uint)stack_length + 1 > _max_overflow_length) {
|
||||
_max_overflow_length = (uint)stack_length + 1;
|
||||
}
|
||||
}
|
||||
#endif // PS_PM_STATS
|
||||
}
|
||||
|
||||
void push_breadth(oop o) {
|
||||
assert(!depth_first(), "pre-condition");
|
||||
|
||||
#if PS_PM_STATS
|
||||
++_total_pushes;
|
||||
int stack_length = claimed_stack_breadth()->overflow_stack()->length();
|
||||
#endif // PS_PM_STATS
|
||||
|
||||
claimed_stack_breadth()->push(o);
|
||||
|
||||
#if PS_PM_STATS
|
||||
if (claimed_stack_breadth()->overflow_stack()->length() != stack_length) {
|
||||
++_overflow_pushes;
|
||||
if ((uint)stack_length + 1 > _max_overflow_length) {
|
||||
_max_overflow_length = (uint)stack_length + 1;
|
||||
}
|
||||
}
|
||||
#endif // PS_PM_STATS
|
||||
}
|
||||
|
||||
protected:
|
||||
|
@ -256,12 +220,5 @@ class PSPromotionManager : public CHeapObj {
|
|||
template <class T> inline void claim_or_forward_depth(T* p);
|
||||
template <class T> inline void claim_or_forward_breadth(T* p);
|
||||
|
||||
#if PS_PM_STATS
|
||||
void increment_steals(oop* p = NULL) {
|
||||
_total_steals += 1;
|
||||
if (p != NULL && is_oop_masked(p)) {
|
||||
_masked_steals += 1;
|
||||
}
|
||||
}
|
||||
#endif // PS_PM_STATS
|
||||
TASKQUEUE_STATS_ONLY(inline void record_steal(StarTask& p);)
|
||||
};
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -124,3 +124,11 @@ inline void PSPromotionManager::process_popped_location_depth(StarTask p) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#if TASKQUEUE_STATS
|
||||
void PSPromotionManager::record_steal(StarTask& p) {
|
||||
if (is_oop_masked(p)) {
|
||||
++_masked_steals;
|
||||
}
|
||||
}
|
||||
#endif // TASKQUEUE_STATS
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -148,9 +148,7 @@ void StealTask::do_it(GCTaskManager* manager, uint which) {
|
|||
while(true) {
|
||||
StarTask p;
|
||||
if (PSPromotionManager::steal_depth(which, &random_seed, p)) {
|
||||
#if PS_PM_STATS
|
||||
pm->increment_steals(p);
|
||||
#endif // PS_PM_STATS
|
||||
TASKQUEUE_STATS_ONLY(pm->record_steal(p));
|
||||
pm->process_popped_location_depth(p);
|
||||
pm->drain_stacks_depth(true);
|
||||
} else {
|
||||
|
@ -163,9 +161,6 @@ void StealTask::do_it(GCTaskManager* manager, uint which) {
|
|||
while(true) {
|
||||
oop obj;
|
||||
if (PSPromotionManager::steal_breadth(which, &random_seed, obj)) {
|
||||
#if PS_PM_STATS
|
||||
pm->increment_steals();
|
||||
#endif // PS_PM_STATS
|
||||
obj->copy_contents(pm);
|
||||
pm->drain_stacks_breadth(true);
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue