--- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Fri Aug 06 10:17:21 2010 -0700
+++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp Mon Aug 09 05:41:05 2010 -0700
@@ -46,17 +46,7 @@
class ConcurrentG1Refine;
class ConcurrentZFThread;
-// If want to accumulate detailed statistics on work queues
-// turn this on.
-#define G1_DETAILED_STATS 0
-
-#if G1_DETAILED_STATS
-# define IF_G1_DETAILED_STATS(code) code
-#else
-# define IF_G1_DETAILED_STATS(code)
-#endif
-
-typedef GenericTaskQueue<StarTask> RefToScanQueue;
+typedef OverflowTaskQueue<StarTask> RefToScanQueue;
typedef GenericTaskQueueSet<RefToScanQueue> RefToScanQueueSet;
typedef int RegionIdx_t; // needs to hold [ 0..max_regions() )
@@ -471,6 +461,12 @@
virtual void shrink(size_t expand_bytes);
void shrink_helper(size_t expand_bytes);
+ #if TASKQUEUE_STATS
+ static void print_taskqueue_stats_hdr(outputStream* const st = gclog_or_tty);
+ void print_taskqueue_stats(outputStream* const st = gclog_or_tty) const;
+ void reset_taskqueue_stats();
+ #endif // TASKQUEUE_STATS
+
// Do an incremental collection: identify a collection set, and evacuate
// its live objects elsewhere.
virtual void do_collection_pause();
@@ -662,7 +658,7 @@
public:
void set_refine_cte_cl_concurrency(bool concurrent);
- RefToScanQueue *task_queue(int i);
+ RefToScanQueue *task_queue(int i) const;
// A set of cards where updates happened during the GC
DirtyCardQueueSet& dirty_card_queue_set() { return _dirty_card_queue_set; }
@@ -1579,9 +1575,6 @@
CardTableModRefBS* _ct_bs;
G1RemSet* _g1_rem;
- typedef GrowableArray<StarTask> OverflowQueue;
- OverflowQueue* _overflowed_refs;
-
G1ParGCAllocBuffer _surviving_alloc_buffer;
G1ParGCAllocBuffer _tenured_alloc_buffer;
G1ParGCAllocBuffer* _alloc_buffers[GCAllocPurposeCount];
@@ -1598,10 +1591,6 @@
int _queue_num;
size_t _term_attempts;
-#if G1_DETAILED_STATS
- int _pushes, _pops, _steals, _steal_attempts;
- int _overflow_pushes;
-#endif
double _start;
double _start_strong_roots;
@@ -1615,7 +1604,7 @@
// this points into the array, as we use the first few entries for padding
size_t* _surviving_young_words;
-#define PADDING_ELEM_NUM (64 / sizeof(size_t))
+#define PADDING_ELEM_NUM (DEFAULT_CACHE_LINE_SIZE / sizeof(size_t))
void add_to_alloc_buffer_waste(size_t waste) { _alloc_buffer_waste += waste; }
@@ -1650,15 +1639,14 @@
}
RefToScanQueue* refs() { return _refs; }
- OverflowQueue* overflowed_refs() { return _overflowed_refs; }
ageTable* age_table() { return &_age_table; }
G1ParGCAllocBuffer* alloc_buffer(GCAllocPurpose purpose) {
return _alloc_buffers[purpose];
}
- size_t alloc_buffer_waste() { return _alloc_buffer_waste; }
- size_t undo_waste() { return _undo_waste; }
+ size_t alloc_buffer_waste() const { return _alloc_buffer_waste; }
+ size_t undo_waste() const { return _undo_waste; }
template <class T> void push_on_queue(T* ref) {
assert(ref != NULL, "invariant");
@@ -1671,12 +1659,7 @@
assert(_g1h->obj_in_cs(p), "Should be in CS");
}
#endif
- if (!refs()->push(ref)) {
- overflowed_refs()->push(ref);
- IF_G1_DETAILED_STATS(note_overflow_push());
- } else {
- IF_G1_DETAILED_STATS(note_push());
- }
+ refs()->push(ref);
}
void pop_from_queue(StarTask& ref) {
@@ -1687,7 +1670,6 @@
_g1h->is_in_g1_reserved(ref.is_narrow() ? oopDesc::load_decode_heap_oop((narrowOop*)ref)
: oopDesc::load_decode_heap_oop((oop*)ref)),
"invariant");
- IF_G1_DETAILED_STATS(note_pop());
} else {
StarTask null_task;
ref = null_task;
@@ -1695,7 +1677,8 @@
}
void pop_from_overflow_queue(StarTask& ref) {
- StarTask new_ref = overflowed_refs()->pop();
+ StarTask new_ref;
+ refs()->pop_overflow(new_ref);
assert((oop*)new_ref != NULL, "pop() from a local non-empty stack");
assert(UseCompressedOops || !new_ref.is_narrow(), "Error");
assert(has_partial_array_mask((oop*)new_ref) ||
@@ -1705,8 +1688,8 @@
ref = new_ref;
}
- int refs_to_scan() { return refs()->size(); }
- int overflowed_refs_to_scan() { return overflowed_refs()->length(); }
+ int refs_to_scan() { return refs()->size(); }
+ int overflowed_refs_to_scan() { return refs()->overflow_stack()->length(); }
template <class T> void update_rs(HeapRegion* from, T* p, int tid) {
if (G1DeferredRSUpdate) {
@@ -1775,30 +1758,16 @@
int* hash_seed() { return &_hash_seed; }
int queue_num() { return _queue_num; }
- size_t term_attempts() { return _term_attempts; }
+ size_t term_attempts() const { return _term_attempts; }
void note_term_attempt() { _term_attempts++; }
-#if G1_DETAILED_STATS
- int pushes() { return _pushes; }
- int pops() { return _pops; }
- int steals() { return _steals; }
- int steal_attempts() { return _steal_attempts; }
- int overflow_pushes() { return _overflow_pushes; }
-
- void note_push() { _pushes++; }
- void note_pop() { _pops++; }
- void note_steal() { _steals++; }
- void note_steal_attempt() { _steal_attempts++; }
- void note_overflow_push() { _overflow_pushes++; }
-#endif
-
void start_strong_roots() {
_start_strong_roots = os::elapsedTime();
}
void end_strong_roots() {
_strong_roots_time += (os::elapsedTime() - _start_strong_roots);
}
- double strong_roots_time() { return _strong_roots_time; }
+ double strong_roots_time() const { return _strong_roots_time; }
void start_term_time() {
note_term_attempt();
@@ -1807,12 +1776,17 @@
void end_term_time() {
_term_time += (os::elapsedTime() - _start_term);
}
- double term_time() { return _term_time; }
+ double term_time() const { return _term_time; }
- double elapsed() {
+ double elapsed_time() const {
return os::elapsedTime() - _start;
}
+ static void
+ print_termination_stats_hdr(outputStream* const st = gclog_or_tty);
+ void
+ print_termination_stats(int i, outputStream* const st = gclog_or_tty) const;
+
size_t* surviving_young_words() {
// We add on to hide entry 0 which accumulates surviving words for
// age -1 regions (i.e. non-young ones)