提交 c667a7a4 编写于 作者: S stefank

8035412: Cleanup ClassLoaderData::is_alive

Reviewed-by: coleenp, mgerdin
上级 23be3758
...@@ -73,7 +73,11 @@ ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL; ...@@ -73,7 +73,11 @@ ClassLoaderData * ClassLoaderData::_the_null_class_loader_data = NULL;
ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) : ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Dependencies dependencies) :
_class_loader(h_class_loader()), _class_loader(h_class_loader()),
_is_anonymous(is_anonymous), _keep_alive(is_anonymous), // initially _is_anonymous(is_anonymous),
// An anonymous class loader data doesn't have anything to keep
// it from being unloaded during parsing of the anonymous class.
// The null-class-loader should always be kept alive.
_keep_alive(is_anonymous || h_class_loader.is_null()),
_metaspace(NULL), _unloading(false), _klasses(NULL), _metaspace(NULL), _unloading(false), _klasses(NULL),
_claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL), _claimed(0), _jmethod_ids(NULL), _handles(NULL), _deallocate_list(NULL),
_next(NULL), _dependencies(dependencies), _next(NULL), _dependencies(dependencies),
...@@ -317,11 +321,15 @@ void ClassLoaderData::unload() { ...@@ -317,11 +321,15 @@ void ClassLoaderData::unload() {
} }
} }
oop ClassLoaderData::keep_alive_object() const {
assert(!keep_alive(), "Don't use with CLDs that are artificially kept alive");
return is_anonymous() ? _klasses->java_mirror() : class_loader();
}
bool ClassLoaderData::is_alive(BoolObjectClosure* is_alive_closure) const { bool ClassLoaderData::is_alive(BoolObjectClosure* is_alive_closure) const {
bool alive = bool alive = keep_alive() // null class loader and incomplete anonymous klasses.
is_anonymous() ? || is_alive_closure->do_object_b(keep_alive_object());
is_alive_closure->do_object_b(_klasses->java_mirror()) :
class_loader() == NULL || is_alive_closure->do_object_b(class_loader());
assert(!alive || claimed(), "must be claimed"); assert(!alive || claimed(), "must be claimed");
return alive; return alive;
} }
...@@ -601,8 +609,6 @@ void ClassLoaderDataGraph::keep_alive_oops_do(OopClosure* f, KlassClosure* klass ...@@ -601,8 +609,6 @@ void ClassLoaderDataGraph::keep_alive_oops_do(OopClosure* f, KlassClosure* klass
void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) { void ClassLoaderDataGraph::always_strong_oops_do(OopClosure* f, KlassClosure* klass_closure, bool must_claim) {
if (ClassUnloading) { if (ClassUnloading) {
ClassLoaderData::the_null_class_loader_data()->oops_do(f, klass_closure, must_claim);
// keep any special CLDs alive.
ClassLoaderDataGraph::keep_alive_oops_do(f, klass_closure, must_claim); ClassLoaderDataGraph::keep_alive_oops_do(f, klass_closure, must_claim);
} else { } else {
ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim); ClassLoaderDataGraph::oops_do(f, klass_closure, must_claim);
...@@ -689,7 +695,7 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) { ...@@ -689,7 +695,7 @@ bool ClassLoaderDataGraph::do_unloading(BoolObjectClosure* is_alive_closure) {
bool has_redefined_a_class = JvmtiExport::has_redefined_a_class(); bool has_redefined_a_class = JvmtiExport::has_redefined_a_class();
MetadataOnStackMark md_on_stack; MetadataOnStackMark md_on_stack;
while (data != NULL) { while (data != NULL) {
if (data->keep_alive() || data->is_alive(is_alive_closure)) { if (data->is_alive(is_alive_closure)) {
if (has_redefined_a_class) { if (has_redefined_a_class) {
data->classes_do(InstanceKlass::purge_previous_versions); data->classes_do(InstanceKlass::purge_previous_versions);
} }
......
...@@ -149,7 +149,7 @@ class ClassLoaderData : public CHeapObj<mtClass> { ...@@ -149,7 +149,7 @@ class ClassLoaderData : public CHeapObj<mtClass> {
// classes in the class loader are allocated. // classes in the class loader are allocated.
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup. Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
bool _unloading; // true if this class loader goes away bool _unloading; // true if this class loader goes away
bool _keep_alive; // if this CLD can be unloaded for anonymous loaders bool _keep_alive; // if this CLD is kept alive without a keep_alive_object().
bool _is_anonymous; // if this CLD is for an anonymous class bool _is_anonymous; // if this CLD is for an anonymous class
volatile int _claimed; // true if claimed, for example during GC traces. volatile int _claimed; // true if claimed, for example during GC traces.
// To avoid applying oop closure more than once. // To avoid applying oop closure more than once.
...@@ -240,13 +240,16 @@ class ClassLoaderData : public CHeapObj<mtClass> { ...@@ -240,13 +240,16 @@ class ClassLoaderData : public CHeapObj<mtClass> {
oop class_loader() const { return _class_loader; } oop class_loader() const { return _class_loader; }
// The object the GC is using to keep this ClassLoaderData alive.
oop keep_alive_object() const;
// Returns true if this class loader data is for a loader going away. // Returns true if this class loader data is for a loader going away.
bool is_unloading() const { bool is_unloading() const {
assert(!(is_the_null_class_loader_data() && _unloading), "The null class loader can never be unloaded"); assert(!(is_the_null_class_loader_data() && _unloading), "The null class loader can never be unloaded");
return _unloading; return _unloading;
} }
// Anonymous class loader data doesn't have anything to keep them from
// being unloaded during parsing the anonymous class. // Used to make sure that this CLD is not unloaded.
void set_keep_alive(bool value) { _keep_alive = value; } void set_keep_alive(bool value) { _keep_alive = value; }
unsigned int identity_hash() { unsigned int identity_hash() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册