提交 8af5aec8 编写于 作者: S stefank

Merge

...@@ -309,12 +309,10 @@ int CodeCache::alignment_offset() { ...@@ -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 { ...@@ -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) { ...@@ -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() { ...@@ -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, ...@@ -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, ...@@ -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: ...@@ -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) { ...@@ -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();
......
...@@ -129,7 +129,7 @@ void WorkerDataArray<T>::print(int level, const char* title) { ...@@ -129,7 +129,7 @@ void WorkerDataArray<T>::print(int level, const char* title) {
buf.append_and_print_cr("]"); buf.append_and_print_cr("]");
} }
#ifdef ASSERT #ifndef PRODUCT
template <class T> template <class T>
void WorkerDataArray<T>::reset() { void WorkerDataArray<T>::reset() {
......
...@@ -151,9 +151,7 @@ void G1MarkSweep::mark_sweep_phase1(bool& marked_for_unloading, ...@@ -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) { ...@@ -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, ...@@ -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, ...@@ -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
......
...@@ -2518,7 +2518,7 @@ void SpaceManager::dump(outputStream* const out) const { ...@@ -2518,7 +2518,7 @@ void SpaceManager::dump(outputStream* const out) const {
" waste " SIZE_FORMAT, curr_total, used, free, capacity, waste); " waste " SIZE_FORMAT, curr_total, used, free, capacity, waste);
} }
#ifndef PRODUCT #ifdef ASSERT
void SpaceManager::mangle_freed_chunks() { void SpaceManager::mangle_freed_chunks() {
for (ChunkIndex index = SmallIndex; for (ChunkIndex index = SmallIndex;
index < NumberOfFreeLists; index < NumberOfFreeLists;
...@@ -2536,7 +2536,7 @@ void SpaceManager::mangle_freed_chunks() { ...@@ -2536,7 +2536,7 @@ void SpaceManager::mangle_freed_chunks() {
} }
} }
} }
#endif // PRODUCT #endif // ASSERT
// MetaspaceAux // MetaspaceAux
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册