Merge
This commit is contained in:
commit
ceccaf4577
@ -309,12 +309,10 @@ int CodeCache::alignment_offset() {
|
|||||||
|
|
||||||
// Mark nmethods for unloading if they contain otherwise unreachable
|
// Mark nmethods for unloading if they contain otherwise unreachable
|
||||||
// oops.
|
// oops.
|
||||||
void CodeCache::do_unloading(BoolObjectClosure* is_alive,
|
void CodeCache::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred) {
|
||||||
OopClosure* keep_alive,
|
|
||||||
bool unloading_occurred) {
|
|
||||||
assert_locked_or_safepoint(CodeCache_lock);
|
assert_locked_or_safepoint(CodeCache_lock);
|
||||||
FOR_ALL_ALIVE_NMETHODS(nm) {
|
FOR_ALL_ALIVE_NMETHODS(nm) {
|
||||||
nm->do_unloading(is_alive, keep_alive, unloading_occurred);
|
nm->do_unloading(is_alive, unloading_occurred);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -130,9 +130,7 @@ class CodeCache : AllStatic {
|
|||||||
// If "unloading_occurred" is true, then unloads (i.e., breaks root links
|
// If "unloading_occurred" is true, then unloads (i.e., breaks root links
|
||||||
// to) any unmarked codeBlobs in the cache. Sets "marked_for_unloading"
|
// to) any unmarked codeBlobs in the cache. Sets "marked_for_unloading"
|
||||||
// to "true" iff some code got unloaded.
|
// to "true" iff some code got unloaded.
|
||||||
static void do_unloading(BoolObjectClosure* is_alive,
|
static void do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred);
|
||||||
OopClosure* keep_alive,
|
|
||||||
bool unloading_occurred);
|
|
||||||
static void oops_do(OopClosure* f) {
|
static void oops_do(OopClosure* f) {
|
||||||
CodeBlobToOopClosure oopc(f, /*do_marking=*/ false);
|
CodeBlobToOopClosure oopc(f, /*do_marking=*/ false);
|
||||||
blobs_do(&oopc);
|
blobs_do(&oopc);
|
||||||
|
@ -1472,9 +1472,7 @@ void nmethod::flush_dependencies(BoolObjectClosure* is_alive) {
|
|||||||
|
|
||||||
|
|
||||||
// If this oop is not live, the nmethod can be unloaded.
|
// If this oop is not live, the nmethod can be unloaded.
|
||||||
bool nmethod::can_unload(BoolObjectClosure* is_alive,
|
bool nmethod::can_unload(BoolObjectClosure* is_alive, oop* root, bool unloading_occurred) {
|
||||||
OopClosure* keep_alive,
|
|
||||||
oop* root, bool unloading_occurred) {
|
|
||||||
assert(root != NULL, "just checking");
|
assert(root != NULL, "just checking");
|
||||||
oop obj = *root;
|
oop obj = *root;
|
||||||
if (obj == NULL || is_alive->do_object_b(obj)) {
|
if (obj == NULL || is_alive->do_object_b(obj)) {
|
||||||
@ -1583,8 +1581,7 @@ void nmethod::post_compiled_method_unload() {
|
|||||||
// GC to unload an nmethod if it contains otherwise unreachable
|
// GC to unload an nmethod if it contains otherwise unreachable
|
||||||
// oops.
|
// oops.
|
||||||
|
|
||||||
void nmethod::do_unloading(BoolObjectClosure* is_alive,
|
void nmethod::do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred) {
|
||||||
OopClosure* keep_alive, bool unloading_occurred) {
|
|
||||||
// Make sure the oop's ready to receive visitors
|
// Make sure the oop's ready to receive visitors
|
||||||
assert(!is_zombie() && !is_unloaded(),
|
assert(!is_zombie() && !is_unloaded(),
|
||||||
"should not call follow on zombie or unloaded nmethod");
|
"should not call follow on zombie or unloaded nmethod");
|
||||||
@ -1672,7 +1669,7 @@ void nmethod::do_unloading(BoolObjectClosure* is_alive,
|
|||||||
(r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()),
|
(r->oop_addr() >= oops_begin() && r->oop_addr() < oops_end()),
|
||||||
"oop must be found in exactly one place");
|
"oop must be found in exactly one place");
|
||||||
if (r->oop_is_immediate() && r->oop_value() != NULL) {
|
if (r->oop_is_immediate() && r->oop_value() != NULL) {
|
||||||
if (can_unload(is_alive, keep_alive, r->oop_addr(), unloading_occurred)) {
|
if (can_unload(is_alive, r->oop_addr(), unloading_occurred)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1684,7 +1681,7 @@ void nmethod::do_unloading(BoolObjectClosure* is_alive,
|
|||||||
// Scopes
|
// Scopes
|
||||||
for (oop* p = oops_begin(); p < oops_end(); p++) {
|
for (oop* p = oops_begin(); p < oops_end(); p++) {
|
||||||
if (*p == Universe::non_oop_word()) continue; // skip non-oops
|
if (*p == Universe::non_oop_word()) continue; // skip non-oops
|
||||||
if (can_unload(is_alive, keep_alive, p, unloading_occurred)) {
|
if (can_unload(is_alive, p, unloading_occurred)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -556,10 +556,8 @@ public:
|
|||||||
void set_method(Method* method) { _method = method; }
|
void set_method(Method* method) { _method = method; }
|
||||||
|
|
||||||
// GC support
|
// GC support
|
||||||
void do_unloading(BoolObjectClosure* is_alive, OopClosure* keep_alive,
|
void do_unloading(BoolObjectClosure* is_alive, bool unloading_occurred);
|
||||||
bool unloading_occurred);
|
bool can_unload(BoolObjectClosure* is_alive, oop* root, bool unloading_occurred);
|
||||||
bool can_unload(BoolObjectClosure* is_alive, OopClosure* keep_alive,
|
|
||||||
oop* root, bool unloading_occurred);
|
|
||||||
|
|
||||||
void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
|
void preserve_callee_argument_oops(frame fr, const RegisterMap *reg_map,
|
||||||
OopClosure* f);
|
OopClosure* f);
|
||||||
|
@ -5954,9 +5954,7 @@ void CMSCollector::refProcessingWork(bool asynch, bool clear_all_soft_refs) {
|
|||||||
bool purged_class = SystemDictionary::do_unloading(&_is_alive_closure);
|
bool purged_class = SystemDictionary::do_unloading(&_is_alive_closure);
|
||||||
|
|
||||||
// Follow CodeCache roots and unload any methods marked for unloading
|
// Follow CodeCache roots and unload any methods marked for unloading
|
||||||
CodeCache::do_unloading(&_is_alive_closure,
|
CodeCache::do_unloading(&_is_alive_closure, purged_class);
|
||||||
&cmsKeepAliveClosure,
|
|
||||||
purged_class);
|
|
||||||
|
|
||||||
cmsDrainMarkingStackClosure.do_void();
|
cmsDrainMarkingStackClosure.do_void();
|
||||||
verify_work_stacks_empty();
|
verify_work_stacks_empty();
|
||||||
|
@ -151,9 +151,7 @@ void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading,
|
|||||||
|
|
||||||
// Follow code cache roots (has to be done after system dictionary,
|
// Follow code cache roots (has to be done after system dictionary,
|
||||||
// assumes all live klasses are marked)
|
// assumes all live klasses are marked)
|
||||||
CodeCache::do_unloading(&GenMarkSweep::is_alive,
|
CodeCache::do_unloading(&GenMarkSweep::is_alive, purged_class);
|
||||||
&GenMarkSweep::keep_alive,
|
|
||||||
purged_class);
|
|
||||||
GenMarkSweep::follow_stack();
|
GenMarkSweep::follow_stack();
|
||||||
|
|
||||||
// Update subklass/sibling/implementor links of live klasses
|
// Update subklass/sibling/implementor links of live klasses
|
||||||
|
@ -521,8 +521,7 @@ void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
|
|||||||
bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
|
bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
|
||||||
|
|
||||||
// Follow code cache roots
|
// Follow code cache roots
|
||||||
CodeCache::do_unloading(is_alive_closure(), mark_and_push_closure(),
|
CodeCache::do_unloading(is_alive_closure(), purged_class);
|
||||||
purged_class);
|
|
||||||
follow_stack(); // Flush marking stack
|
follow_stack(); // Flush marking stack
|
||||||
|
|
||||||
// Update subklass/sibling/implementor links of live klasses
|
// Update subklass/sibling/implementor links of live klasses
|
||||||
|
@ -2375,8 +2375,7 @@ void PSParallelCompact::marking_phase(ParCompactionManager* cm,
|
|||||||
bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
|
bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
|
||||||
|
|
||||||
// Follow code cache roots.
|
// Follow code cache roots.
|
||||||
CodeCache::do_unloading(is_alive_closure(), &mark_and_push_closure,
|
CodeCache::do_unloading(is_alive_closure(), purged_class);
|
||||||
purged_class);
|
|
||||||
cm->follow_marking_stacks(); // Flush marking stack.
|
cm->follow_marking_stacks(); // Flush marking stack.
|
||||||
|
|
||||||
// Update subklass/sibling/implementor links of live klasses
|
// Update subklass/sibling/implementor links of live klasses
|
||||||
|
@ -291,7 +291,7 @@ void GenMarkSweep::mark_sweep_phase1(int level,
|
|||||||
bool purged_class = SystemDictionary::do_unloading(&is_alive);
|
bool purged_class = SystemDictionary::do_unloading(&is_alive);
|
||||||
|
|
||||||
// Follow code cache roots
|
// Follow code cache roots
|
||||||
CodeCache::do_unloading(&is_alive, &keep_alive, purged_class);
|
CodeCache::do_unloading(&is_alive, purged_class);
|
||||||
follow_stack(); // Flush marking stack
|
follow_stack(); // Flush marking stack
|
||||||
|
|
||||||
// Update subklass/sibling/implementor links of live klasses
|
// Update subklass/sibling/implementor links of live klasses
|
||||||
|
Loading…
x
Reference in New Issue
Block a user