提交 19c54e8a 编写于 作者: T tonyp

Merge

...@@ -252,12 +252,13 @@ class ModUnionClosurePar: public ModUnionClosure { ...@@ -252,12 +252,13 @@ class ModUnionClosurePar: public ModUnionClosure {
class ChunkArray: public CHeapObj { class ChunkArray: public CHeapObj {
size_t _index; size_t _index;
size_t _capacity; size_t _capacity;
size_t _overflows;
HeapWord** _array; // storage for array HeapWord** _array; // storage for array
public: public:
ChunkArray() : _index(0), _capacity(0), _array(NULL) {} ChunkArray() : _index(0), _capacity(0), _overflows(0), _array(NULL) {}
ChunkArray(HeapWord** a, size_t c): ChunkArray(HeapWord** a, size_t c):
_index(0), _capacity(c), _array(a) {} _index(0), _capacity(c), _overflows(0), _array(a) {}
HeapWord** array() { return _array; } HeapWord** array() { return _array; }
void set_array(HeapWord** a) { _array = a; } void set_array(HeapWord** a) { _array = a; }
...@@ -266,7 +267,9 @@ class ChunkArray: public CHeapObj { ...@@ -266,7 +267,9 @@ class ChunkArray: public CHeapObj {
void set_capacity(size_t c) { _capacity = c; } void set_capacity(size_t c) { _capacity = c; }
size_t end() { size_t end() {
assert(_index < capacity(), "_index out of bounds"); assert(_index <= capacity(),
err_msg("_index (" SIZE_FORMAT ") > _capacity (" SIZE_FORMAT "): out of bounds",
_index, _capacity));
return _index; return _index;
} // exclusive } // exclusive
...@@ -277,12 +280,23 @@ class ChunkArray: public CHeapObj { ...@@ -277,12 +280,23 @@ class ChunkArray: public CHeapObj {
void reset() { void reset() {
_index = 0; _index = 0;
if (_overflows > 0 && PrintCMSStatistics > 1) {
warning("CMS: ChunkArray[" SIZE_FORMAT "] overflowed " SIZE_FORMAT " times",
_capacity, _overflows);
}
_overflows = 0;
} }
void record_sample(HeapWord* p, size_t sz) { void record_sample(HeapWord* p, size_t sz) {
// For now we do not do anything with the size // For now we do not do anything with the size
if (_index < _capacity) { if (_index < _capacity) {
_array[_index++] = p; _array[_index++] = p;
} else {
++_overflows;
assert(_index == _capacity,
err_msg("_index (" SIZE_FORMAT ") > _capacity (" SIZE_FORMAT
"): out of bounds at overflow#" SIZE_FORMAT,
_index, _capacity, _overflows));
} }
} }
}; };
......
...@@ -2753,7 +2753,7 @@ void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const { ...@@ -2753,7 +2753,7 @@ void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
print_taskqueue_stats_hdr(st); print_taskqueue_stats_hdr(st);
TaskQueueStats totals; TaskQueueStats totals;
const int n = MAX2(workers()->total_workers(), 1); const int n = workers() != NULL ? workers()->total_workers() : 1;
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr(); st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
totals += task_queue(i)->stats; totals += task_queue(i)->stats;
...@@ -2764,7 +2764,7 @@ void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const { ...@@ -2764,7 +2764,7 @@ void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
} }
void G1CollectedHeap::reset_taskqueue_stats() { void G1CollectedHeap::reset_taskqueue_stats() {
const int n = MAX2(workers()->total_workers(), 1); const int n = workers() != NULL ? workers()->total_workers() : 1;
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
task_queue(i)->stats.reset(); task_queue(i)->stats.reset();
} }
......
...@@ -28,12 +28,11 @@ ...@@ -28,12 +28,11 @@
G1MemoryPoolSuper::G1MemoryPoolSuper(G1CollectedHeap* g1h, G1MemoryPoolSuper::G1MemoryPoolSuper(G1CollectedHeap* g1h,
const char* name, const char* name,
size_t init_size, size_t init_size,
size_t max_size,
bool support_usage_threshold) : bool support_usage_threshold) :
_g1h(g1h), CollectedMemoryPool(name, _g1h(g1h), CollectedMemoryPool(name,
MemoryPool::Heap, MemoryPool::Heap,
init_size, init_size,
max_size, undefined_max(),
support_usage_threshold) { support_usage_threshold) {
assert(UseG1GC, "sanity"); assert(UseG1GC, "sanity");
} }
...@@ -52,13 +51,6 @@ size_t G1MemoryPoolSuper::eden_space_used(G1CollectedHeap* g1h) { ...@@ -52,13 +51,6 @@ size_t G1MemoryPoolSuper::eden_space_used(G1CollectedHeap* g1h) {
return eden_used; return eden_used;
} }
// See the comment at the top of g1MemoryPool.hpp
size_t G1MemoryPoolSuper::eden_space_max(G1CollectedHeap* g1h) {
// This should ensure that it returns a value no smaller than the
// region size. Currently, eden_space_committed() guarantees that.
return eden_space_committed(g1h);
}
// See the comment at the top of g1MemoryPool.hpp // See the comment at the top of g1MemoryPool.hpp
size_t G1MemoryPoolSuper::survivor_space_committed(G1CollectedHeap* g1h) { size_t G1MemoryPoolSuper::survivor_space_committed(G1CollectedHeap* g1h) {
return MAX2(survivor_space_used(g1h), (size_t) HeapRegion::GrainBytes); return MAX2(survivor_space_used(g1h), (size_t) HeapRegion::GrainBytes);
...@@ -71,13 +63,6 @@ size_t G1MemoryPoolSuper::survivor_space_used(G1CollectedHeap* g1h) { ...@@ -71,13 +63,6 @@ size_t G1MemoryPoolSuper::survivor_space_used(G1CollectedHeap* g1h) {
return survivor_used; return survivor_used;
} }
// See the comment at the top of g1MemoryPool.hpp
size_t G1MemoryPoolSuper::survivor_space_max(G1CollectedHeap* g1h) {
// This should ensure that it returns a value no smaller than the
// region size. Currently, survivor_space_committed() guarantees that.
return survivor_space_committed(g1h);
}
// See the comment at the top of g1MemoryPool.hpp // See the comment at the top of g1MemoryPool.hpp
size_t G1MemoryPoolSuper::old_space_committed(G1CollectedHeap* g1h) { size_t G1MemoryPoolSuper::old_space_committed(G1CollectedHeap* g1h) {
size_t committed = overall_committed(g1h); size_t committed = overall_committed(g1h);
...@@ -99,24 +84,11 @@ size_t G1MemoryPoolSuper::old_space_used(G1CollectedHeap* g1h) { ...@@ -99,24 +84,11 @@ size_t G1MemoryPoolSuper::old_space_used(G1CollectedHeap* g1h) {
return used; return used;
} }
// See the comment at the top of g1MemoryPool.hpp
size_t G1MemoryPoolSuper::old_space_max(G1CollectedHeap* g1h) {
size_t max = overall_max(g1h);
size_t eden_max = eden_space_max(g1h);
size_t survivor_max = survivor_space_max(g1h);
max = subtract_up_to_zero(max, eden_max);
max = subtract_up_to_zero(max, survivor_max);
max = MAX2(max, (size_t) HeapRegion::GrainBytes);
return max;
}
G1EdenPool::G1EdenPool(G1CollectedHeap* g1h) : G1EdenPool::G1EdenPool(G1CollectedHeap* g1h) :
G1MemoryPoolSuper(g1h, G1MemoryPoolSuper(g1h,
"G1 Eden", "G1 Eden",
eden_space_committed(g1h), /* init_size */ eden_space_committed(g1h), /* init_size */
eden_space_max(g1h), /* max_size */ false /* support_usage_threshold */) { }
false /* support_usage_threshold */) {
}
MemoryUsage G1EdenPool::get_memory_usage() { MemoryUsage G1EdenPool::get_memory_usage() {
size_t initial_sz = initial_size(); size_t initial_sz = initial_size();
...@@ -131,9 +103,7 @@ G1SurvivorPool::G1SurvivorPool(G1CollectedHeap* g1h) : ...@@ -131,9 +103,7 @@ G1SurvivorPool::G1SurvivorPool(G1CollectedHeap* g1h) :
G1MemoryPoolSuper(g1h, G1MemoryPoolSuper(g1h,
"G1 Survivor", "G1 Survivor",
survivor_space_committed(g1h), /* init_size */ survivor_space_committed(g1h), /* init_size */
survivor_space_max(g1h), /* max_size */ false /* support_usage_threshold */) { }
false /* support_usage_threshold */) {
}
MemoryUsage G1SurvivorPool::get_memory_usage() { MemoryUsage G1SurvivorPool::get_memory_usage() {
size_t initial_sz = initial_size(); size_t initial_sz = initial_size();
...@@ -148,9 +118,7 @@ G1OldGenPool::G1OldGenPool(G1CollectedHeap* g1h) : ...@@ -148,9 +118,7 @@ G1OldGenPool::G1OldGenPool(G1CollectedHeap* g1h) :
G1MemoryPoolSuper(g1h, G1MemoryPoolSuper(g1h,
"G1 Old Gen", "G1 Old Gen",
old_space_committed(g1h), /* init_size */ old_space_committed(g1h), /* init_size */
old_space_max(g1h), /* max_size */ true /* support_usage_threshold */) { }
true /* support_usage_threshold */) {
}
MemoryUsage G1OldGenPool::get_memory_usage() { MemoryUsage G1OldGenPool::get_memory_usage() {
size_t initial_sz = initial_size(); size_t initial_sz = initial_size();
......
...@@ -74,14 +74,20 @@ class G1CollectedHeap; ...@@ -74,14 +74,20 @@ class G1CollectedHeap;
// in the future. // in the future.
// //
// 3) Another decision that is again not straightforward is what is // 3) Another decision that is again not straightforward is what is
// the max size that each memory pool can grow to. Right now, we set // the max size that each memory pool can grow to. One way to do this
// that the committed size for the eden and the survivors and // would be to use the committed size for the max for the eden and
// calculate the old gen max as follows (basically, it's a similar // survivors and calculate the old gen max as follows (basically, it's
// pattern to what we use for the committed space, as described // a similar pattern to what we use for the committed space, as
// above): // described above):
// //
// old_gen_max = overall_max - eden_max - survivor_max // old_gen_max = overall_max - eden_max - survivor_max
// //
// Unfortunately, the above makes the max of each pool fluctuate over
// time and, even though this is allowed according to the spec, it
// broke several assumptions in the M&M framework (there were cases
// where used would reach a value greater than max). So, for max we
// use -1, which means "undefined" according to the spec.
//
// 4) Now, there is a very subtle issue with all the above. The // 4) Now, there is a very subtle issue with all the above. The
// framework will call get_memory_usage() on the three pools // framework will call get_memory_usage() on the three pools
// asynchronously. As a result, each call might get a different value // asynchronously. As a result, each call might get a different value
...@@ -125,33 +131,30 @@ protected: ...@@ -125,33 +131,30 @@ protected:
G1MemoryPoolSuper(G1CollectedHeap* g1h, G1MemoryPoolSuper(G1CollectedHeap* g1h,
const char* name, const char* name,
size_t init_size, size_t init_size,
size_t max_size,
bool support_usage_threshold); bool support_usage_threshold);
// The reason why all the code is in static methods is so that it // The reason why all the code is in static methods is so that it
// can be safely called from the constructors of the subclasses. // can be safely called from the constructors of the subclasses.
static size_t undefined_max() {
return (size_t) -1;
}
static size_t overall_committed(G1CollectedHeap* g1h) { static size_t overall_committed(G1CollectedHeap* g1h) {
return g1h->capacity(); return g1h->capacity();
} }
static size_t overall_used(G1CollectedHeap* g1h) { static size_t overall_used(G1CollectedHeap* g1h) {
return g1h->used_unlocked(); return g1h->used_unlocked();
} }
static size_t overall_max(G1CollectedHeap* g1h) {
return g1h->g1_reserved_obj_bytes();
}
static size_t eden_space_committed(G1CollectedHeap* g1h); static size_t eden_space_committed(G1CollectedHeap* g1h);
static size_t eden_space_used(G1CollectedHeap* g1h); static size_t eden_space_used(G1CollectedHeap* g1h);
static size_t eden_space_max(G1CollectedHeap* g1h);
static size_t survivor_space_committed(G1CollectedHeap* g1h); static size_t survivor_space_committed(G1CollectedHeap* g1h);
static size_t survivor_space_used(G1CollectedHeap* g1h); static size_t survivor_space_used(G1CollectedHeap* g1h);
static size_t survivor_space_max(G1CollectedHeap* g1h);
static size_t old_space_committed(G1CollectedHeap* g1h); static size_t old_space_committed(G1CollectedHeap* g1h);
static size_t old_space_used(G1CollectedHeap* g1h); static size_t old_space_used(G1CollectedHeap* g1h);
static size_t old_space_max(G1CollectedHeap* g1h);
}; };
// Memory pool that represents the G1 eden. // Memory pool that represents the G1 eden.
...@@ -163,7 +166,7 @@ public: ...@@ -163,7 +166,7 @@ public:
return eden_space_used(_g1h); return eden_space_used(_g1h);
} }
size_t max_size() const { size_t max_size() const {
return eden_space_max(_g1h); return undefined_max();
} }
MemoryUsage get_memory_usage(); MemoryUsage get_memory_usage();
}; };
...@@ -177,7 +180,7 @@ public: ...@@ -177,7 +180,7 @@ public:
return survivor_space_used(_g1h); return survivor_space_used(_g1h);
} }
size_t max_size() const { size_t max_size() const {
return survivor_space_max(_g1h); return undefined_max();
} }
MemoryUsage get_memory_usage(); MemoryUsage get_memory_usage();
}; };
...@@ -191,7 +194,7 @@ public: ...@@ -191,7 +194,7 @@ public:
return old_space_used(_g1h); return old_space_used(_g1h);
} }
size_t max_size() const { size_t max_size() const {
return old_space_max(_g1h); return undefined_max();
} }
MemoryUsage get_memory_usage(); MemoryUsage get_memory_usage();
}; };
...@@ -785,10 +785,11 @@ JVM_ENTRY(jobject, jmm_GetMemoryUsage(JNIEnv* env, jboolean heap)) ...@@ -785,10 +785,11 @@ JVM_ENTRY(jobject, jmm_GetMemoryUsage(JNIEnv* env, jboolean heap))
} }
} }
// In our current implementation, all pools should have // In our current implementation, we make sure that all non-heap
// defined init and max size // pools have defined init and max sizes. Heap pools do not matter,
assert(!has_undefined_init_size, "Undefined init size"); // as we never use total_init and total_max for them.
assert(!has_undefined_max_size, "Undefined max size"); assert(heap || !has_undefined_init_size, "Undefined init size");
assert(heap || !has_undefined_max_size, "Undefined max size");
MemoryUsage usage((heap ? InitialHeapSize : total_init), MemoryUsage usage((heap ? InitialHeapSize : total_init),
total_used, total_used,
......
...@@ -121,7 +121,7 @@ public class Test6581734 { ...@@ -121,7 +121,7 @@ public class Test6581734 {
} }
if (collectorsWithTime<collectorsFound) { if (collectorsWithTime<collectorsFound) {
throw new RuntimeException("collectors found with zero time"; throw new RuntimeException("collectors found with zero time");
} }
System.out.println("Test passed."); System.out.println("Test passed.");
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册