Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
50aa3339
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看板
提交
50aa3339
编写于
6月 17, 2008
作者:
Y
ysr
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
41883fc2
994dac67
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
51 addition
and
6 deletion
+51
-6
src/share/vm/memory/cardTableModRefBS.cpp
src/share/vm/memory/cardTableModRefBS.cpp
+51
-6
未找到文件。
src/share/vm/memory/cardTableModRefBS.cpp
浏览文件 @
50aa3339
...
@@ -196,6 +196,8 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
...
@@ -196,6 +196,8 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
assert
(
_whole_heap
.
contains
(
new_region
),
assert
(
_whole_heap
.
contains
(
new_region
),
"attempt to cover area not in reserved area"
);
"attempt to cover area not in reserved area"
);
debug_only
(
verify_guard
();)
debug_only
(
verify_guard
();)
// collided is true if the expansion would push into another committed region
debug_only
(
bool
collided
=
false
;)
int
const
ind
=
find_covering_region_by_base
(
new_region
.
start
());
int
const
ind
=
find_covering_region_by_base
(
new_region
.
start
());
MemRegion
const
old_region
=
_covered
[
ind
];
MemRegion
const
old_region
=
_covered
[
ind
];
assert
(
old_region
.
start
()
==
new_region
.
start
(),
"just checking"
);
assert
(
old_region
.
start
()
==
new_region
.
start
(),
"just checking"
);
...
@@ -211,12 +213,36 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
...
@@ -211,12 +213,36 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
}
}
// Align the end up to a page size (starts are already aligned).
// Align the end up to a page size (starts are already aligned).
jbyte
*
const
new_end
=
byte_after
(
new_region
.
last
());
jbyte
*
const
new_end
=
byte_after
(
new_region
.
last
());
HeapWord
*
const
new_end_aligned
=
HeapWord
*
new_end_aligned
=
(
HeapWord
*
)
align_size_up
((
uintptr_t
)
new_end
,
_page_size
);
(
HeapWord
*
)
align_size_up
((
uintptr_t
)
new_end
,
_page_size
);
assert
(
new_end_aligned
>=
(
HeapWord
*
)
new_end
,
assert
(
new_end_aligned
>=
(
HeapWord
*
)
new_end
,
"align up, but less"
);
"align up, but less"
);
int
ri
=
0
;
for
(
ri
=
0
;
ri
<
_cur_covered_regions
;
ri
++
)
{
if
(
ri
!=
ind
)
{
if
(
_committed
[
ri
].
contains
(
new_end_aligned
))
{
assert
((
new_end_aligned
>=
_committed
[
ri
].
start
())
&&
(
_committed
[
ri
].
start
()
>
_committed
[
ind
].
start
()),
"New end of committed region is inconsistent"
);
new_end_aligned
=
_committed
[
ri
].
start
();
assert
(
new_end_aligned
>
_committed
[
ind
].
start
(),
"New end of committed region is before start"
);
debug_only
(
collided
=
true
;)
// Should only collide with 1 region
break
;
}
}
}
#ifdef ASSERT
for
(
++
ri
;
ri
<
_cur_covered_regions
;
ri
++
)
{
assert
(
!
_committed
[
ri
].
contains
(
new_end_aligned
),
"New end of committed region is in a second committed region"
);
}
#endif
// The guard page is always committed and should not be committed over.
// The guard page is always committed and should not be committed over.
HeapWord
*
const
new_end_for_commit
=
MIN2
(
new_end_aligned
,
_guard_region
.
start
());
HeapWord
*
const
new_end_for_commit
=
MIN2
(
new_end_aligned
,
_guard_region
.
start
());
if
(
new_end_for_commit
>
cur_committed
.
end
())
{
if
(
new_end_for_commit
>
cur_committed
.
end
())
{
// Must commit new pages.
// Must commit new pages.
MemRegion
const
new_committed
=
MemRegion
const
new_committed
=
...
@@ -239,9 +265,11 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
...
@@ -239,9 +265,11 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
if
(
!
uncommit_region
.
is_empty
())
{
if
(
!
uncommit_region
.
is_empty
())
{
if
(
!
os
::
uncommit_memory
((
char
*
)
uncommit_region
.
start
(),
if
(
!
os
::
uncommit_memory
((
char
*
)
uncommit_region
.
start
(),
uncommit_region
.
byte_size
()))
{
uncommit_region
.
byte_size
()))
{
// Do better than this for Merlin
assert
(
false
,
"Card table contraction failed"
);
vm_exit_out_of_memory
(
uncommit_region
.
byte_size
(),
// The call failed so don't change the end of the
"card table contraction"
);
// committed region. This is better than taking the
// VM down.
new_end_aligned
=
_committed
[
ind
].
end
();
}
}
}
}
}
}
...
@@ -257,8 +285,25 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
...
@@ -257,8 +285,25 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) {
}
}
assert
(
index_for
(
new_region
.
last
())
<
(
int
)
_guard_index
,
assert
(
index_for
(
new_region
.
last
())
<
(
int
)
_guard_index
,
"The guard card will be overwritten"
);
"The guard card will be overwritten"
);
jbyte
*
const
end
=
byte_after
(
new_region
.
last
());
// This line commented out cleans the newly expanded region and
// not the aligned up expanded region.
// jbyte* const end = byte_after(new_region.last());
jbyte
*
const
end
=
(
jbyte
*
)
new_end_for_commit
;
assert
((
end
>=
byte_after
(
new_region
.
last
()))
||
collided
,
"Expect to be beyond new region unless impacting another region"
);
// do nothing if we resized downward.
// do nothing if we resized downward.
#ifdef ASSERT
for
(
int
ri
=
0
;
ri
<
_cur_covered_regions
;
ri
++
)
{
if
(
ri
!=
ind
)
{
// The end of the new committed region should not
// be in any existing region unless it matches
// the start of the next region.
assert
(
!
_committed
[
ri
].
contains
(
end
)
||
(
_committed
[
ri
].
start
()
==
(
HeapWord
*
)
end
),
"Overlapping committed regions"
);
}
}
#endif
if
(
entry
<
end
)
{
if
(
entry
<
end
)
{
memset
(
entry
,
clean_card
,
pointer_delta
(
end
,
entry
,
sizeof
(
jbyte
)));
memset
(
entry
,
clean_card
,
pointer_delta
(
end
,
entry
,
sizeof
(
jbyte
)));
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录