提交 9d3cf533 编写于 作者: Y ysr

6662086: 6u4+, 7b11+: CMS never clears referents when -XX:+ParallelRefProcEnabled

Summary: Construct the relevant CMSIsAliveClosure used by CMS during parallel reference processing with the correct span. It had incorrectly been constructed with an empty span, a regression introduced in 6417901.
Reviewed-by: jcoomes
上级 ca698d05
...@@ -329,7 +329,7 @@ class Par_PushOrMarkClosure: public OopClosure { ...@@ -329,7 +329,7 @@ class Par_PushOrMarkClosure: public OopClosure {
class CMSKeepAliveClosure: public OopClosure { class CMSKeepAliveClosure: public OopClosure {
private: private:
CMSCollector* _collector; CMSCollector* _collector;
MemRegion _span; const MemRegion _span;
CMSMarkStack* _mark_stack; CMSMarkStack* _mark_stack;
CMSBitMap* _bit_map; CMSBitMap* _bit_map;
protected: protected:
...@@ -340,7 +340,9 @@ class CMSKeepAliveClosure: public OopClosure { ...@@ -340,7 +340,9 @@ class CMSKeepAliveClosure: public OopClosure {
_collector(collector), _collector(collector),
_span(span), _span(span),
_bit_map(bit_map), _bit_map(bit_map),
_mark_stack(mark_stack) { } _mark_stack(mark_stack) {
assert(!_span.is_empty(), "Empty span could spell trouble");
}
virtual void do_oop(oop* p); virtual void do_oop(oop* p);
virtual void do_oop(narrowOop* p); virtual void do_oop(narrowOop* p);
inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); } inline void do_oop_nv(oop* p) { CMSKeepAliveClosure::do_oop_work(p); }
......
...@@ -520,7 +520,10 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen, ...@@ -520,7 +520,10 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
-1 /* lock-free */, "No_lock" /* dummy */), -1 /* lock-free */, "No_lock" /* dummy */),
_modUnionClosure(&_modUnionTable), _modUnionClosure(&_modUnionTable),
_modUnionClosurePar(&_modUnionTable), _modUnionClosurePar(&_modUnionTable),
_is_alive_closure(&_markBitMap), // Adjust my span to cover old (cms) gen and perm gen
_span(cmsGen->reserved()._union(permGen->reserved())),
// Construct the is_alive_closure with _span & markBitMap
_is_alive_closure(_span, &_markBitMap),
_restart_addr(NULL), _restart_addr(NULL),
_overflow_list(NULL), _overflow_list(NULL),
_preserved_oop_stack(NULL), _preserved_oop_stack(NULL),
...@@ -572,11 +575,6 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen, ...@@ -572,11 +575,6 @@ CMSCollector::CMSCollector(ConcurrentMarkSweepGeneration* cmsGen,
_cmsGen->cmsSpace()->set_collector(this); _cmsGen->cmsSpace()->set_collector(this);
_permGen->cmsSpace()->set_collector(this); _permGen->cmsSpace()->set_collector(this);
// Adjust my span to cover old (cms) gen and perm gen
_span = _cmsGen->reserved()._union(_permGen->reserved());
// Initialize the span of is_alive_closure
_is_alive_closure.set_span(_span);
// Allocate MUT and marking bit map // Allocate MUT and marking bit map
{ {
MutexLockerEx x(_markBitMap.lock(), Mutex::_no_safepoint_check_flag); MutexLockerEx x(_markBitMap.lock(), Mutex::_no_safepoint_check_flag);
...@@ -5496,7 +5494,7 @@ class CMSRefProcTaskProxy: public AbstractGangTask { ...@@ -5496,7 +5494,7 @@ class CMSRefProcTaskProxy: public AbstractGangTask {
typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask; typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
CMSCollector* _collector; CMSCollector* _collector;
CMSBitMap* _mark_bit_map; CMSBitMap* _mark_bit_map;
MemRegion _span; const MemRegion _span;
OopTaskQueueSet* _task_queues; OopTaskQueueSet* _task_queues;
ParallelTaskTerminator _term; ParallelTaskTerminator _term;
ProcessTask& _task; ProcessTask& _task;
...@@ -5513,7 +5511,10 @@ public: ...@@ -5513,7 +5511,10 @@ public:
_collector(collector), _span(span), _mark_bit_map(mark_bit_map), _collector(collector), _span(span), _mark_bit_map(mark_bit_map),
_task_queues(task_queues), _task_queues(task_queues),
_term(total_workers, task_queues) _term(total_workers, task_queues)
{ } {
assert(_collector->_span.equals(_span) && !_span.is_empty(),
"Inconsistency in _span");
}
OopTaskQueueSet* task_queues() { return _task_queues; } OopTaskQueueSet* task_queues() { return _task_queues; }
...@@ -5530,11 +5531,12 @@ public: ...@@ -5530,11 +5531,12 @@ public:
}; };
void CMSRefProcTaskProxy::work(int i) { void CMSRefProcTaskProxy::work(int i) {
assert(_collector->_span.equals(_span), "Inconsistency in _span");
CMSParKeepAliveClosure par_keep_alive(_collector, _span, CMSParKeepAliveClosure par_keep_alive(_collector, _span,
_mark_bit_map, work_queue(i)); _mark_bit_map, work_queue(i));
CMSParDrainMarkingStackClosure par_drain_stack(_collector, _span, CMSParDrainMarkingStackClosure par_drain_stack(_collector, _span,
_mark_bit_map, work_queue(i)); _mark_bit_map, work_queue(i));
CMSIsAliveClosure is_alive_closure(_mark_bit_map); CMSIsAliveClosure is_alive_closure(_span, _mark_bit_map);
_task.work(i, is_alive_closure, par_keep_alive, par_drain_stack); _task.work(i, is_alive_closure, par_keep_alive, par_drain_stack);
if (_task.marks_oops_alive()) { if (_task.marks_oops_alive()) {
do_work_steal(i, &par_drain_stack, &par_keep_alive, do_work_steal(i, &par_drain_stack, &par_keep_alive,
......
...@@ -435,23 +435,22 @@ class CMSStats VALUE_OBJ_CLASS_SPEC { ...@@ -435,23 +435,22 @@ class CMSStats VALUE_OBJ_CLASS_SPEC {
// if the object is "live" (reachable). Used in weak // if the object is "live" (reachable). Used in weak
// reference processing. // reference processing.
class CMSIsAliveClosure: public BoolObjectClosure { class CMSIsAliveClosure: public BoolObjectClosure {
MemRegion _span; const MemRegion _span;
const CMSBitMap* _bit_map; const CMSBitMap* _bit_map;
friend class CMSCollector; friend class CMSCollector;
protected:
void set_span(MemRegion span) { _span = span; }
public: public:
CMSIsAliveClosure(CMSBitMap* bit_map):
_bit_map(bit_map) { }
CMSIsAliveClosure(MemRegion span, CMSIsAliveClosure(MemRegion span,
CMSBitMap* bit_map): CMSBitMap* bit_map):
_span(span), _span(span),
_bit_map(bit_map) { } _bit_map(bit_map) {
assert(!span.is_empty(), "Empty span could spell trouble");
}
void do_object(oop obj) { void do_object(oop obj) {
assert(false, "not to be invoked"); assert(false, "not to be invoked");
} }
bool do_object_b(oop obj); bool do_object_b(oop obj);
}; };
...@@ -600,7 +599,7 @@ class CMSCollector: public CHeapObj { ...@@ -600,7 +599,7 @@ class CMSCollector: public CHeapObj {
// ("Weak") Reference processing support // ("Weak") Reference processing support
ReferenceProcessor* _ref_processor; ReferenceProcessor* _ref_processor;
CMSIsAliveClosure _is_alive_closure; CMSIsAliveClosure _is_alive_closure;
// keep this textually after _markBitMap; c'tor dependency // keep this textually after _markBitMap and _span; c'tor dependency
ConcurrentMarkSweepThread* _cmsThread; // the thread doing the work ConcurrentMarkSweepThread* _cmsThread; // the thread doing the work
ModUnionClosure _modUnionClosure; ModUnionClosure _modUnionClosure;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册