mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 23:34:52 +02:00
8010196: NPG: Internal Error: Metaspace allocation lock -- possible deadlock
Refactor the CLD dependency list into a separate class. Use an ObjectLocker to synchronize additions to the CLD dependency list. Reviewed-by: stefank, coleenp
This commit is contained in:
parent
6f3fdce7b3
commit
0edccc9e61
3 changed files with 159 additions and 17 deletions
|
@ -93,6 +93,18 @@ class ClassLoaderDataGraph : public AllStatic {
|
|||
class ClassLoaderData : public CHeapObj<mtClass> {
|
||||
friend class VMStructs;
|
||||
private:
|
||||
class Dependencies VALUE_OBJ_CLASS_SPEC {
|
||||
objArrayOop _list_head;
|
||||
void locked_add(objArrayHandle last,
|
||||
objArrayHandle new_dependency,
|
||||
Thread* THREAD);
|
||||
public:
|
||||
Dependencies() : _list_head(NULL) {}
|
||||
void add(Handle dependency, TRAPS);
|
||||
void init(TRAPS);
|
||||
void oops_do(OopClosure* f);
|
||||
};
|
||||
|
||||
friend class ClassLoaderDataGraph;
|
||||
friend class ClassLoaderDataGraphMetaspaceIterator;
|
||||
friend class MetaDataFactory;
|
||||
|
@ -100,10 +112,11 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||
|
||||
static ClassLoaderData * _the_null_class_loader_data;
|
||||
|
||||
oop _class_loader; // oop used to uniquely identify a class loader
|
||||
// class loader or a canonical class path
|
||||
oop _dependencies; // oop to hold dependencies from this class loader
|
||||
// data to others.
|
||||
oop _class_loader; // oop used to uniquely identify a class loader
|
||||
// class loader or a canonical class path
|
||||
Dependencies _dependencies; // holds dependencies from this class loader
|
||||
// data to others.
|
||||
|
||||
Metaspace * _metaspace; // Meta-space where meta-data defined by the
|
||||
// classes in the class loader are allocated.
|
||||
Mutex* _metaspace_lock; // Locks the metaspace for allocations and setup.
|
||||
|
@ -134,9 +147,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
|
|||
static Metaspace* _ro_metaspace;
|
||||
static Metaspace* _rw_metaspace;
|
||||
|
||||
void add_dependency(Handle dependency, TRAPS);
|
||||
void locked_add_dependency(objArrayHandle last, objArrayHandle new_dependency);
|
||||
|
||||
void set_next(ClassLoaderData* next) { _next = next; }
|
||||
ClassLoaderData* next() const { return _next; }
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue