Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
a7dee824
D
dragonwell8_hotspot
项目概览
openanolis
/
dragonwell8_hotspot
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_hotspot
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
a7dee824
编写于
4月 26, 2017
作者:
S
shshahma
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8168914: Crash in ClassLoaderData/JNIHandleBlock::oops_do during concurrent marking
Reviewed-by: dholmes, ehelin
上级
7122fc6e
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
71 addition
and
22 deletion
+71
-22
src/share/vm/classfile/classLoaderData.cpp
src/share/vm/classfile/classLoaderData.cpp
+43
-16
src/share/vm/classfile/classLoaderData.hpp
src/share/vm/classfile/classLoaderData.hpp
+28
-6
未找到文件。
src/share/vm/classfile/classLoaderData.cpp
浏览文件 @
a7dee824
/*
* Copyright (c) 2012, 201
4
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 201
7
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -78,7 +78,7 @@ ClassLoaderData::ClassLoaderData(Handle h_class_loader, bool is_anonymous, Depen
// The null-class-loader should always be kept alive.
_keep_alive
(
is_anonymous
||
h_class_loader
.
is_null
()),
_metaspace
(
NULL
),
_unloading
(
false
),
_klasses
(
NULL
),
_claimed
(
0
),
_jmethod_ids
(
NULL
),
_handles
(
NULL
),
_deallocate_list
(
NULL
),
_claimed
(
0
),
_jmethod_ids
(
NULL
),
_handles
(),
_deallocate_list
(
NULL
),
_next
(
NULL
),
_dependencies
(
dependencies
),
_metaspace_lock
(
new
Mutex
(
Monitor
::
leaf
+
1
,
"Metaspace allocation lock"
,
true
))
{
// empty
...
...
@@ -96,6 +96,45 @@ void ClassLoaderData::Dependencies::init(TRAPS) {
_list_head
=
oopFactory
::
new_objectArray
(
2
,
CHECK
);
}
ClassLoaderData
::
ChunkedHandleList
::~
ChunkedHandleList
()
{
Chunk
*
c
=
_head
;
while
(
c
!=
NULL
)
{
Chunk
*
next
=
c
->
_next
;
delete
c
;
c
=
next
;
}
}
oop
*
ClassLoaderData
::
ChunkedHandleList
::
add
(
oop
o
)
{
if
(
_head
==
NULL
||
_head
->
_size
==
Chunk
::
CAPACITY
)
{
Chunk
*
next
=
new
Chunk
(
_head
);
OrderAccess
::
release_store_ptr
(
&
_head
,
next
);
}
oop
*
handle
=
&
_head
->
_data
[
_head
->
_size
];
*
handle
=
o
;
OrderAccess
::
release_store
(
&
_head
->
_size
,
_head
->
_size
+
1
);
return
handle
;
}
inline
void
ClassLoaderData
::
ChunkedHandleList
::
oops_do_chunk
(
OopClosure
*
f
,
Chunk
*
c
,
const
juint
size
)
{
for
(
juint
i
=
0
;
i
<
size
;
i
++
)
{
if
(
c
->
_data
[
i
]
!=
NULL
)
{
f
->
do_oop
(
&
c
->
_data
[
i
]);
}
}
}
void
ClassLoaderData
::
ChunkedHandleList
::
oops_do
(
OopClosure
*
f
)
{
Chunk
*
head
=
(
Chunk
*
)
OrderAccess
::
load_ptr_acquire
(
&
_head
);
if
(
head
!=
NULL
)
{
// Must be careful when reading size of head
oops_do_chunk
(
f
,
head
,
OrderAccess
::
load_acquire
(
&
head
->
_size
));
for
(
Chunk
*
c
=
head
->
_next
;
c
!=
NULL
;
c
=
c
->
_next
)
{
oops_do_chunk
(
f
,
c
,
c
->
_size
);
}
}
}
bool
ClassLoaderData
::
claim
()
{
if
(
_claimed
==
1
)
{
return
false
;
...
...
@@ -111,7 +150,7 @@ void ClassLoaderData::oops_do(OopClosure* f, KlassClosure* klass_closure, bool m
f
->
do_oop
(
&
_class_loader
);
_dependencies
.
oops_do
(
f
);
_handles
->
oops_do
(
f
);
_handles
.
oops_do
(
f
);
if
(
klass_closure
!=
NULL
)
{
classes_do
(
klass_closure
);
}
...
...
@@ -342,11 +381,6 @@ ClassLoaderData::~ClassLoaderData() {
_metaspace
=
NULL
;
// release the metaspace
delete
m
;
// release the handles
if
(
_handles
!=
NULL
)
{
JNIHandleBlock
::
release_block
(
_handles
);
_handles
=
NULL
;
}
}
// Clear all the JNI handles for methods
...
...
@@ -406,15 +440,9 @@ Metaspace* ClassLoaderData::metaspace_non_null() {
return
_metaspace
;
}
JNIHandleBlock
*
ClassLoaderData
::
handles
()
const
{
return
_handles
;
}
void
ClassLoaderData
::
set_handles
(
JNIHandleBlock
*
handles
)
{
_handles
=
handles
;
}
jobject
ClassLoaderData
::
add_handle
(
Handle
h
)
{
MutexLockerEx
ml
(
metaspace_lock
(),
Mutex
::
_no_safepoint_check_flag
);
if
(
handles
()
==
NULL
)
{
set_handles
(
JNIHandleBlock
::
allocate_block
());
}
return
handles
()
->
allocate_handle
(
h
());
return
(
jobject
)
_handles
.
add
(
h
());
}
// Add this metadata pointer to be freed when it's safe. This is only during
...
...
@@ -479,7 +507,6 @@ void ClassLoaderData::dump(outputStream * const out) {
p2i
(
class_loader
()
!=
NULL
?
class_loader
()
->
klass
()
:
NULL
),
loader_name
());
if
(
claimed
())
out
->
print
(
" claimed "
);
if
(
is_unloading
())
out
->
print
(
" unloading "
);
out
->
print
(
" handles "
INTPTR_FORMAT
,
p2i
(
handles
()));
out
->
cr
();
if
(
metaspace_or_null
()
!=
NULL
)
{
out
->
print_cr
(
"metaspace: "
INTPTR_FORMAT
,
p2i
(
metaspace_or_null
()));
...
...
src/share/vm/classfile/classLoaderData.hpp
浏览文件 @
a7dee824
/*
* Copyright (c) 2012, 201
4
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 201
7
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
...
...
@@ -51,7 +51,6 @@
class
ClassLoaderData
;
class
JNIMethodBlock
;
class
JNIHandleBlock
;
class
Metadebug
;
// GC root for walking class loader data created
...
...
@@ -145,6 +144,31 @@ class ClassLoaderData : public CHeapObj<mtClass> {
void
oops_do
(
OopClosure
*
f
);
};
class
ChunkedHandleList
VALUE_OBJ_CLASS_SPEC
{
struct
Chunk
:
public
CHeapObj
<
mtClass
>
{
static
const
size_t
CAPACITY
=
32
;
oop
_data
[
CAPACITY
];
volatile
juint
_size
;
Chunk
*
_next
;
Chunk
(
Chunk
*
c
)
:
_next
(
c
),
_size
(
0
)
{
}
};
Chunk
*
_head
;
void
oops_do_chunk
(
OopClosure
*
f
,
Chunk
*
c
,
const
juint
size
);
public:
ChunkedHandleList
()
:
_head
(
NULL
)
{}
~
ChunkedHandleList
();
// Only one thread at a time can add, guarded by ClassLoaderData::metaspace_lock().
// However, multiple threads can execute oops_do concurrently with add.
oop
*
add
(
oop
o
);
void
oops_do
(
OopClosure
*
f
);
};
friend
class
ClassLoaderDataGraph
;
friend
class
ClassLoaderDataGraphKlassIteratorAtomic
;
friend
class
ClassLoaderDataGraphMetaspaceIterator
;
...
...
@@ -169,7 +193,8 @@ class ClassLoaderData : public CHeapObj<mtClass> {
// Has to be an int because we cas it.
Klass
*
_klasses
;
// The classes defined by the class loader.
JNIHandleBlock
*
_handles
;
// Handles to constant pool arrays
ChunkedHandleList
_handles
;
// Handles to constant pool arrays, etc, which
// have the same life cycle of the corresponding ClassLoader.
// These method IDs are created for the class loader and set to NULL when the
// class loader is unloaded. They are rarely freed, only for redefine classes
...
...
@@ -196,9 +221,6 @@ class ClassLoaderData : public CHeapObj<mtClass> {
void
set_metaspace
(
Metaspace
*
m
)
{
_metaspace
=
m
;
}
JNIHandleBlock
*
handles
()
const
;
void
set_handles
(
JNIHandleBlock
*
handles
);
Mutex
*
metaspace_lock
()
const
{
return
_metaspace_lock
;
}
// GC interface.
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录