Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
c18d8b56
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看板
提交
c18d8b56
编写于
3月 31, 2012
作者:
J
jcoomes
浏览文件
操作
浏览文件
下载
差异文件
Merge
上级
1eb32329
9fc44e39
变更
19
隐藏空白更改
内联
并排
Showing
19 changed file
with
169 addition
and
114 deletion
+169
-114
.hgtags
.hgtags
+2
-0
make/hotspot_version
make/hotspot_version
+1
-1
make/jprt.properties
make/jprt.properties
+2
-0
src/share/vm/gc_implementation/g1/collectionSetChooser.cpp
src/share/vm/gc_implementation/g1/collectionSetChooser.cpp
+1
-1
src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
+2
-2
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
+9
-7
src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
+1
-1
src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
+3
-4
src/share/vm/gc_implementation/g1/g1_globals.hpp
src/share/vm/gc_implementation/g1/g1_globals.hpp
+6
-7
src/share/vm/gc_implementation/g1/vm_operations_g1.cpp
src/share/vm/gc_implementation/g1/vm_operations_g1.cpp
+53
-8
src/share/vm/gc_implementation/g1/vm_operations_g1.hpp
src/share/vm/gc_implementation/g1/vm_operations_g1.hpp
+10
-5
src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp
...ementation/parallelScavenge/psPromotionManager.inline.hpp
+1
-0
src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
+29
-21
src/share/vm/gc_interface/collectedHeap.cpp
src/share/vm/gc_interface/collectedHeap.cpp
+5
-9
src/share/vm/gc_interface/collectedHeap.hpp
src/share/vm/gc_interface/collectedHeap.hpp
+9
-16
src/share/vm/gc_interface/collectedHeap.inline.hpp
src/share/vm/gc_interface/collectedHeap.inline.hpp
+15
-20
src/share/vm/oops/klass.cpp
src/share/vm/oops/klass.cpp
+3
-4
src/share/vm/oops/klass.hpp
src/share/vm/oops/klass.hpp
+3
-3
test/Makefile
test/Makefile
+14
-5
未找到文件。
.hgtags
浏览文件 @
c18d8b56
...
@@ -234,3 +234,5 @@ dfae0140457cfb2c381d7679735fbedbae862c62 hs24-b03
...
@@ -234,3 +234,5 @@ dfae0140457cfb2c381d7679735fbedbae862c62 hs24-b03
f4767e53d6e0d5da7e3f1775904076cce54247c1 hs24-b04
f4767e53d6e0d5da7e3f1775904076cce54247c1 hs24-b04
0cd147eaa673d1642b2f466f5dc257cf192db524 jdk8-b31
0cd147eaa673d1642b2f466f5dc257cf192db524 jdk8-b31
27863e4586de38be7dd17da4163f542038f4d1d7 hs24-b05
27863e4586de38be7dd17da4163f542038f4d1d7 hs24-b05
25410a347ebb0bef166c4338a90d9dea82463a20 jdk8-b32
cd47da9383cd932cb2b659064057feafa2a91134 hs24-b06
make/hotspot_version
浏览文件 @
c18d8b56
...
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2011
...
@@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2011
HS_MAJOR_VER=24
HS_MAJOR_VER=24
HS_MINOR_VER=0
HS_MINOR_VER=0
HS_BUILD_NUMBER=0
6
HS_BUILD_NUMBER=0
7
JDK_MAJOR_VER=1
JDK_MAJOR_VER=1
JDK_MINOR_VER=8
JDK_MINOR_VER=8
...
...
make/jprt.properties
浏览文件 @
c18d8b56
...
@@ -446,6 +446,7 @@ jprt.test.targets.embedded= \
...
@@ -446,6 +446,7 @@ jprt.test.targets.embedded= \
jprt.test.targets.jdk8
=
${jprt.test.targets.standard}
jprt.test.targets.jdk8
=
${jprt.test.targets.standard}
jprt.test.targets.jdk7
=
${jprt.test.targets.standard}
jprt.test.targets.jdk7
=
${jprt.test.targets.standard}
jprt.test.targets.jdk7u4
=
${jprt.test.targets.jdk7}
jprt.test.targets
=
${jprt.test.targets.${jprt.tools.default.release}}
jprt.test.targets
=
${jprt.test.targets.${jprt.tools.default.release}}
# The default test/Makefile targets that should be run
# The default test/Makefile targets that should be run
...
@@ -505,5 +506,6 @@ jprt.make.rule.test.targets.embedded = \
...
@@ -505,5 +506,6 @@ jprt.make.rule.test.targets.embedded = \
jprt.make.rule.test.targets.jdk8
=
${jprt.make.rule.test.targets.standard}
jprt.make.rule.test.targets.jdk8
=
${jprt.make.rule.test.targets.standard}
jprt.make.rule.test.targets.jdk7
=
${jprt.make.rule.test.targets.standard}
jprt.make.rule.test.targets.jdk7
=
${jprt.make.rule.test.targets.standard}
jprt.make.rule.test.targets.jdk7u4
=
${jprt.make.rule.test.targets.jdk7}
jprt.make.rule.test.targets
=
${jprt.make.rule.test.targets.${jprt.tools.default.release}}
jprt.make.rule.test.targets
=
${jprt.make.rule.test.targets.${jprt.tools.default.release}}
src/share/vm/gc_implementation/g1/collectionSetChooser.cpp
浏览文件 @
c18d8b56
...
@@ -285,7 +285,7 @@ size_t CollectionSetChooser::calcMinOldCSetLength() {
...
@@ -285,7 +285,7 @@ size_t CollectionSetChooser::calcMinOldCSetLength() {
// that the result is the same during all mixed GCs that follow a cycle.
// that the result is the same during all mixed GCs that follow a cycle.
const
size_t
region_num
=
(
size_t
)
_length
;
const
size_t
region_num
=
(
size_t
)
_length
;
const
size_t
gc_num
=
(
size_t
)
G1M
axMixedGCNum
;
const
size_t
gc_num
=
(
size_t
)
G1M
ixedGCCountTarget
;
size_t
result
=
region_num
/
gc_num
;
size_t
result
=
region_num
/
gc_num
;
// emulate ceiling
// emulate ceiling
if
(
result
*
gc_num
<
region_num
)
{
if
(
result
*
gc_num
<
region_num
)
{
...
...
src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp
浏览文件 @
c18d8b56
...
@@ -155,7 +155,7 @@ void ConcurrentMarkThread::run() {
...
@@ -155,7 +155,7 @@ void ConcurrentMarkThread::run() {
CMCheckpointRootsFinalClosure
final_cl
(
_cm
);
CMCheckpointRootsFinalClosure
final_cl
(
_cm
);
sprintf
(
verbose_str
,
"GC remark"
);
sprintf
(
verbose_str
,
"GC remark"
);
VM_CGC_Operation
op
(
&
final_cl
,
verbose_str
);
VM_CGC_Operation
op
(
&
final_cl
,
verbose_str
,
true
/* needs_pll */
);
VMThread
::
execute
(
&
op
);
VMThread
::
execute
(
&
op
);
}
}
if
(
cm
()
->
restart_for_overflow
()
&&
if
(
cm
()
->
restart_for_overflow
()
&&
...
@@ -189,7 +189,7 @@ void ConcurrentMarkThread::run() {
...
@@ -189,7 +189,7 @@ void ConcurrentMarkThread::run() {
CMCleanUp
cl_cl
(
_cm
);
CMCleanUp
cl_cl
(
_cm
);
sprintf
(
verbose_str
,
"GC cleanup"
);
sprintf
(
verbose_str
,
"GC cleanup"
);
VM_CGC_Operation
op
(
&
cl_cl
,
verbose_str
);
VM_CGC_Operation
op
(
&
cl_cl
,
verbose_str
,
false
/* needs_pll */
);
VMThread
::
execute
(
&
op
);
VMThread
::
execute
(
&
op
);
}
else
{
}
else
{
// We don't want to update the marking status if a GC pause
// We don't want to update the marking status if a GC pause
...
...
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
浏览文件 @
c18d8b56
...
@@ -993,7 +993,7 @@ HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
...
@@ -993,7 +993,7 @@ HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
// iteration (after taking the Heap_lock).
// iteration (after taking the Heap_lock).
result
=
_mutator_alloc_region
.
attempt_allocation
(
word_size
,
result
=
_mutator_alloc_region
.
attempt_allocation
(
word_size
,
false
/* bot_updates */
);
false
/* bot_updates */
);
if
(
result
!=
NULL
)
{
if
(
result
!=
NULL
)
{
return
result
;
return
result
;
}
}
...
@@ -2437,20 +2437,22 @@ void G1CollectedHeap::collect(GCCause::Cause cause) {
...
@@ -2437,20 +2437,22 @@ void G1CollectedHeap::collect(GCCause::Cause cause) {
true
,
/* should_initiate_conc_mark */
true
,
/* should_initiate_conc_mark */
g1_policy
()
->
max_pause_time_ms
(),
g1_policy
()
->
max_pause_time_ms
(),
cause
);
cause
);
VMThread
::
execute
(
&
op
);
VMThread
::
execute
(
&
op
);
if
(
!
op
.
pause_succeeded
())
{
if
(
!
op
.
pause_succeeded
())
{
// Another GC got scheduled and prevented us from scheduling
// the initial-mark GC. It's unlikely that the GC that
// pre-empted us was also an initial-mark GC. So, we'll retry
// the initial-mark GC.
if
(
full_gc_count_before
==
total_full_collections
())
{
if
(
full_gc_count_before
==
total_full_collections
())
{
retry_gc
=
true
;
retry_gc
=
op
.
should_retry_gc
()
;
}
else
{
}
else
{
// A Full GC happened while we were trying to schedule the
// A Full GC happened while we were trying to schedule the
// initial-mark GC. No point in starting a new cycle given
// initial-mark GC. No point in starting a new cycle given
// that the whole heap was collected anyway.
// that the whole heap was collected anyway.
}
}
if
(
retry_gc
)
{
if
(
GC_locker
::
is_active_and_needs_gc
())
{
GC_locker
::
stall_until_clear
();
}
}
}
}
}
else
{
}
else
{
if
(
cause
==
GCCause
::
_gc_locker
if
(
cause
==
GCCause
::
_gc_locker
...
...
src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
浏览文件 @
c18d8b56
...
@@ -2608,7 +2608,7 @@ bool G1CollectorPolicy::next_gc_should_be_mixed(const char* true_action_str,
...
@@ -2608,7 +2608,7 @@ bool G1CollectorPolicy::next_gc_should_be_mixed(const char* true_action_str,
size_t
reclaimable_bytes
=
cset_chooser
->
remainingReclaimableBytes
();
size_t
reclaimable_bytes
=
cset_chooser
->
remainingReclaimableBytes
();
size_t
capacity_bytes
=
_g1
->
capacity
();
size_t
capacity_bytes
=
_g1
->
capacity
();
double
perc
=
(
double
)
reclaimable_bytes
*
100.0
/
(
double
)
capacity_bytes
;
double
perc
=
(
double
)
reclaimable_bytes
*
100.0
/
(
double
)
capacity_bytes
;
double
threshold
=
(
double
)
G1
OldReclaimableThreshold
Percent
;
double
threshold
=
(
double
)
G1
HeapWaste
Percent
;
if
(
perc
<
threshold
)
{
if
(
perc
<
threshold
)
{
ergo_verbose4
(
ErgoMixedGCs
,
ergo_verbose4
(
ErgoMixedGCs
,
false_action_str
,
false_action_str
,
...
...
src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp
浏览文件 @
c18d8b56
...
@@ -940,10 +940,9 @@ public:
...
@@ -940,10 +940,9 @@ public:
return
_bytes_copied_during_gc
;
return
_bytes_copied_during_gc
;
}
}
// Determine whether the next GC should be mixed. Called to determine
// Determine whether there are candidate regions so that the
// whether to start mixed GCs or whether to carry on doing mixed
// next GC should be mixed. The two action strings are used
// GCs. The two action strings are used in the ergo output when the
// in the ergo output when the method returns true or false.
// method returns true or false.
bool
next_gc_should_be_mixed
(
const
char
*
true_action_str
,
bool
next_gc_should_be_mixed
(
const
char
*
true_action_str
,
const
char
*
false_action_str
);
const
char
*
false_action_str
);
...
...
src/share/vm/gc_implementation/g1/g1_globals.hpp
浏览文件 @
c18d8b56
...
@@ -299,17 +299,16 @@
...
@@ -299,17 +299,16 @@
"Percentage (0-100) of the heap size to use as maximum " \
"Percentage (0-100) of the heap size to use as maximum " \
"young gen size.") \
"young gen size.") \
\
\
develop(uintx, G1OldCSetRegionLiveThresholdPercent, 9
5
, \
develop(uintx, G1OldCSetRegionLiveThresholdPercent, 9
0
, \
"Threshold for regions to be added to the collection set. " \
"Threshold for regions to be added to the collection set. " \
"Regions with more live bytes that this will not be collected.") \
"Regions with more live bytes that this will not be collected.") \
\
\
develop(uintx, G1OldReclaimableThresholdPercent, 1, \
product(uintx, G1HeapWastePercent, 5, \
"Threshold for the remaining old reclaimable bytes, expressed " \
"Amount of space, expressed as a percentage of the heap size, " \
"as a percentage of the heap size. If the old reclaimable bytes " \
"that G1 is willing not to collect to avoid expensive GCs.") \
"are under this we will not collect them with more mixed GCs.") \
\
\
develop(uintx, G1MaxMixedGCNum, 4,
\
product(uintx, G1MixedGCCountTarget, 4,
\
"The
maximum desired number of mixed GCs after a marking cycle.")
\
"The
target number of mixed GCs after a marking cycle.")
\
\
\
develop(uintx, G1OldCSetRegionThresholdPercent, 10, \
develop(uintx, G1OldCSetRegionThresholdPercent, 10, \
"An upper bound for the number of old CSet regions expressed " \
"An upper bound for the number of old CSet regions expressed " \
...
...
src/share/vm/gc_implementation/g1/vm_operations_g1.cpp
浏览文件 @
c18d8b56
...
@@ -34,7 +34,8 @@
...
@@ -34,7 +34,8 @@
VM_G1CollectForAllocation
::
VM_G1CollectForAllocation
(
VM_G1CollectForAllocation
::
VM_G1CollectForAllocation
(
unsigned
int
gc_count_before
,
unsigned
int
gc_count_before
,
size_t
word_size
)
size_t
word_size
)
:
VM_G1OperationWithAllocRequest
(
gc_count_before
,
word_size
)
{
:
VM_G1OperationWithAllocRequest
(
gc_count_before
,
word_size
,
GCCause
::
_allocation_failure
)
{
guarantee
(
word_size
>
0
,
"an allocation should always be requested"
);
guarantee
(
word_size
>
0
,
"an allocation should always be requested"
);
}
}
...
@@ -57,9 +58,10 @@ VM_G1IncCollectionPause::VM_G1IncCollectionPause(
...
@@ -57,9 +58,10 @@ VM_G1IncCollectionPause::VM_G1IncCollectionPause(
bool
should_initiate_conc_mark
,
bool
should_initiate_conc_mark
,
double
target_pause_time_ms
,
double
target_pause_time_ms
,
GCCause
::
Cause
gc_cause
)
GCCause
::
Cause
gc_cause
)
:
VM_G1OperationWithAllocRequest
(
gc_count_before
,
word_size
),
:
VM_G1OperationWithAllocRequest
(
gc_count_before
,
word_size
,
gc_cause
),
_should_initiate_conc_mark
(
should_initiate_conc_mark
),
_should_initiate_conc_mark
(
should_initiate_conc_mark
),
_target_pause_time_ms
(
target_pause_time_ms
),
_target_pause_time_ms
(
target_pause_time_ms
),
_should_retry_gc
(
false
),
_full_collections_completed_before
(
0
)
{
_full_collections_completed_before
(
0
)
{
guarantee
(
target_pause_time_ms
>
0.0
,
guarantee
(
target_pause_time_ms
>
0.0
,
err_msg
(
"target_pause_time_ms = %1.6lf should be positive"
,
err_msg
(
"target_pause_time_ms = %1.6lf should be positive"
,
...
@@ -70,6 +72,22 @@ VM_G1IncCollectionPause::VM_G1IncCollectionPause(
...
@@ -70,6 +72,22 @@ VM_G1IncCollectionPause::VM_G1IncCollectionPause(
_gc_cause
=
gc_cause
;
_gc_cause
=
gc_cause
;
}
}
bool
VM_G1IncCollectionPause
::
doit_prologue
()
{
bool
res
=
VM_GC_Operation
::
doit_prologue
();
if
(
!
res
)
{
if
(
_should_initiate_conc_mark
)
{
// The prologue can fail for a couple of reasons. The first is that another GC
// got scheduled and prevented the scheduling of the initial mark GC. The
// second is that the GC locker may be active and the heap can't be expanded.
// In both cases we want to retry the GC so that the initial mark pause is
// actually scheduled. In the second case, however, we should stall until
// until the GC locker is no longer active and then retry the initial mark GC.
_should_retry_gc
=
true
;
}
}
return
res
;
}
void
VM_G1IncCollectionPause
::
doit
()
{
void
VM_G1IncCollectionPause
::
doit
()
{
G1CollectedHeap
*
g1h
=
G1CollectedHeap
::
heap
();
G1CollectedHeap
*
g1h
=
G1CollectedHeap
::
heap
();
assert
(
!
_should_initiate_conc_mark
||
assert
(
!
_should_initiate_conc_mark
||
...
@@ -106,11 +124,25 @@ void VM_G1IncCollectionPause::doit() {
...
@@ -106,11 +124,25 @@ void VM_G1IncCollectionPause::doit() {
// next GC pause to be an initial mark; it returns false if a
// next GC pause to be an initial mark; it returns false if a
// marking cycle is already in progress.
// marking cycle is already in progress.
//
//
// If a marking cycle is already in progress just return and skip
// If a marking cycle is already in progress just return and skip the
// the pause - the requesting thread should block in doit_epilogue
// pause below - if the reason for requesting this initial mark pause
// until the marking cycle is complete.
// was due to a System.gc() then the requesting thread should block in
// doit_epilogue() until the marking cycle is complete.
//
// If this initial mark pause was requested as part of a humongous
// allocation then we know that the marking cycle must just have
// been started by another thread (possibly also allocating a humongous
// object) as there was no active marking cycle when the requesting
// thread checked before calling collect() in
// attempt_allocation_humongous(). Retrying the GC, in this case,
// will cause the requesting thread to spin inside collect() until the
// just started marking cycle is complete - which may be a while. So
// we do NOT retry the GC.
if
(
!
res
)
{
if
(
!
res
)
{
assert
(
_word_size
==
0
,
"ExplicitGCInvokesConcurrent shouldn't be allocating"
);
assert
(
_word_size
==
0
,
"Concurrent Full GC/Humongous Object IM shouldn't be allocating"
);
if
(
_gc_cause
!=
GCCause
::
_g1_humongous_allocation
)
{
_should_retry_gc
=
true
;
}
return
;
return
;
}
}
}
}
...
@@ -123,6 +155,13 @@ void VM_G1IncCollectionPause::doit() {
...
@@ -123,6 +155,13 @@ void VM_G1IncCollectionPause::doit() {
true
/* expect_null_cur_alloc_region */
);
true
/* expect_null_cur_alloc_region */
);
}
else
{
}
else
{
assert
(
_result
==
NULL
,
"invariant"
);
assert
(
_result
==
NULL
,
"invariant"
);
if
(
!
_pause_succeeded
)
{
// Another possible reason reason for the pause to not be successful
// is that, again, the GC locker is active (and has become active
// since the prologue was executed). In this case we should retry
// the pause after waiting for the GC locker to become inactive.
_should_retry_gc
=
true
;
}
}
}
}
}
...
@@ -168,6 +207,7 @@ void VM_G1IncCollectionPause::doit_epilogue() {
...
@@ -168,6 +207,7 @@ void VM_G1IncCollectionPause::doit_epilogue() {
}
}
void
VM_CGC_Operation
::
acquire_pending_list_lock
()
{
void
VM_CGC_Operation
::
acquire_pending_list_lock
()
{
assert
(
_needs_pll
,
"don't call this otherwise"
);
// The caller may block while communicating
// The caller may block while communicating
// with the SLT thread in order to acquire/release the PLL.
// with the SLT thread in order to acquire/release the PLL.
ConcurrentMarkThread
::
slt
()
->
ConcurrentMarkThread
::
slt
()
->
...
@@ -175,6 +215,7 @@ void VM_CGC_Operation::acquire_pending_list_lock() {
...
@@ -175,6 +215,7 @@ void VM_CGC_Operation::acquire_pending_list_lock() {
}
}
void
VM_CGC_Operation
::
release_and_notify_pending_list_lock
()
{
void
VM_CGC_Operation
::
release_and_notify_pending_list_lock
()
{
assert
(
_needs_pll
,
"don't call this otherwise"
);
// The caller may block while communicating
// The caller may block while communicating
// with the SLT thread in order to acquire/release the PLL.
// with the SLT thread in order to acquire/release the PLL.
ConcurrentMarkThread
::
slt
()
->
ConcurrentMarkThread
::
slt
()
->
...
@@ -198,7 +239,9 @@ void VM_CGC_Operation::doit() {
...
@@ -198,7 +239,9 @@ void VM_CGC_Operation::doit() {
bool
VM_CGC_Operation
::
doit_prologue
()
{
bool
VM_CGC_Operation
::
doit_prologue
()
{
// Note the relative order of the locks must match that in
// Note the relative order of the locks must match that in
// VM_GC_Operation::doit_prologue() or deadlocks can occur
// VM_GC_Operation::doit_prologue() or deadlocks can occur
acquire_pending_list_lock
();
if
(
_needs_pll
)
{
acquire_pending_list_lock
();
}
Heap_lock
->
lock
();
Heap_lock
->
lock
();
SharedHeap
::
heap
()
->
_thread_holds_heap_lock_for_gc
=
true
;
SharedHeap
::
heap
()
->
_thread_holds_heap_lock_for_gc
=
true
;
...
@@ -210,5 +253,7 @@ void VM_CGC_Operation::doit_epilogue() {
...
@@ -210,5 +253,7 @@ void VM_CGC_Operation::doit_epilogue() {
// VM_GC_Operation::doit_epilogue()
// VM_GC_Operation::doit_epilogue()
SharedHeap
::
heap
()
->
_thread_holds_heap_lock_for_gc
=
false
;
SharedHeap
::
heap
()
->
_thread_holds_heap_lock_for_gc
=
false
;
Heap_lock
->
unlock
();
Heap_lock
->
unlock
();
release_and_notify_pending_list_lock
();
if
(
_needs_pll
)
{
release_and_notify_pending_list_lock
();
}
}
}
src/share/vm/gc_implementation/g1/vm_operations_g1.hpp
浏览文件 @
c18d8b56
/*
/*
* Copyright (c) 2001, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -43,8 +43,9 @@ protected:
...
@@ -43,8 +43,9 @@ protected:
public:
public:
VM_G1OperationWithAllocRequest
(
unsigned
int
gc_count_before
,
VM_G1OperationWithAllocRequest
(
unsigned
int
gc_count_before
,
size_t
word_size
)
size_t
word_size
,
:
VM_GC_Operation
(
gc_count_before
,
GCCause
::
_allocation_failure
),
GCCause
::
Cause
gc_cause
)
:
VM_GC_Operation
(
gc_count_before
,
gc_cause
),
_word_size
(
word_size
),
_result
(
NULL
),
_pause_succeeded
(
false
)
{
}
_word_size
(
word_size
),
_result
(
NULL
),
_pause_succeeded
(
false
)
{
}
HeapWord
*
result
()
{
return
_result
;
}
HeapWord
*
result
()
{
return
_result
;
}
bool
pause_succeeded
()
{
return
_pause_succeeded
;
}
bool
pause_succeeded
()
{
return
_pause_succeeded
;
}
...
@@ -77,6 +78,7 @@ public:
...
@@ -77,6 +78,7 @@ public:
class
VM_G1IncCollectionPause
:
public
VM_G1OperationWithAllocRequest
{
class
VM_G1IncCollectionPause
:
public
VM_G1OperationWithAllocRequest
{
private:
private:
bool
_should_initiate_conc_mark
;
bool
_should_initiate_conc_mark
;
bool
_should_retry_gc
;
double
_target_pause_time_ms
;
double
_target_pause_time_ms
;
unsigned
int
_full_collections_completed_before
;
unsigned
int
_full_collections_completed_before
;
public:
public:
...
@@ -86,11 +88,13 @@ public:
...
@@ -86,11 +88,13 @@ public:
double
target_pause_time_ms
,
double
target_pause_time_ms
,
GCCause
::
Cause
gc_cause
);
GCCause
::
Cause
gc_cause
);
virtual
VMOp_Type
type
()
const
{
return
VMOp_G1IncCollectionPause
;
}
virtual
VMOp_Type
type
()
const
{
return
VMOp_G1IncCollectionPause
;
}
virtual
bool
doit_prologue
();
virtual
void
doit
();
virtual
void
doit
();
virtual
void
doit_epilogue
();
virtual
void
doit_epilogue
();
virtual
const
char
*
name
()
const
{
virtual
const
char
*
name
()
const
{
return
"garbage-first incremental collection pause"
;
return
"garbage-first incremental collection pause"
;
}
}
bool
should_retry_gc
()
const
{
return
_should_retry_gc
;
}
};
};
// Concurrent GC stop-the-world operations such as remark and cleanup;
// Concurrent GC stop-the-world operations such as remark and cleanup;
...
@@ -98,6 +102,7 @@ public:
...
@@ -98,6 +102,7 @@ public:
class
VM_CGC_Operation
:
public
VM_Operation
{
class
VM_CGC_Operation
:
public
VM_Operation
{
VoidClosure
*
_cl
;
VoidClosure
*
_cl
;
const
char
*
_printGCMessage
;
const
char
*
_printGCMessage
;
bool
_needs_pll
;
protected:
protected:
// java.lang.ref.Reference support
// java.lang.ref.Reference support
...
@@ -105,8 +110,8 @@ protected:
...
@@ -105,8 +110,8 @@ protected:
void
release_and_notify_pending_list_lock
();
void
release_and_notify_pending_list_lock
();
public:
public:
VM_CGC_Operation
(
VoidClosure
*
cl
,
const
char
*
printGCMsg
)
VM_CGC_Operation
(
VoidClosure
*
cl
,
const
char
*
printGCMsg
,
bool
needs_pll
)
:
_cl
(
cl
),
_printGCMessage
(
printGCMsg
)
{
}
:
_cl
(
cl
),
_printGCMessage
(
printGCMsg
)
,
_needs_pll
(
needs_pll
)
{
}
virtual
VMOp_Type
type
()
const
{
return
VMOp_CGC_Operation
;
}
virtual
VMOp_Type
type
()
const
{
return
VMOp_CGC_Operation
;
}
virtual
void
doit
();
virtual
void
doit
();
virtual
bool
doit_prologue
();
virtual
bool
doit_prologue
();
...
...
src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp
浏览文件 @
c18d8b56
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
#ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPROMOTIONMANAGER_INLINE_HPP
#ifndef SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPROMOTIONMANAGER_INLINE_HPP
#define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPROMOTIONMANAGER_INLINE_HPP
#define SHARE_VM_GC_IMPLEMENTATION_PARALLELSCAVENGE_PSPROMOTIONMANAGER_INLINE_HPP
#include "gc_implementation/parallelScavenge/psOldGen.hpp"
#include "gc_implementation/parallelScavenge/psPromotionManager.hpp"
#include "gc_implementation/parallelScavenge/psPromotionManager.hpp"
#include "gc_implementation/parallelScavenge/psScavenge.hpp"
#include "gc_implementation/parallelScavenge/psScavenge.hpp"
...
...
src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp
浏览文件 @
c18d8b56
/*
/*
* Copyright (c) 2006, 201
0
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2006, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -91,29 +91,37 @@ void MutableNUMASpace::ensure_parsability() {
...
@@ -91,29 +91,37 @@ void MutableNUMASpace::ensure_parsability() {
MutableSpace
*
s
=
ls
->
space
();
MutableSpace
*
s
=
ls
->
space
();
if
(
s
->
top
()
<
top
())
{
// For all spaces preceding the one containing top()
if
(
s
->
top
()
<
top
())
{
// For all spaces preceding the one containing top()
if
(
s
->
free_in_words
()
>
0
)
{
if
(
s
->
free_in_words
()
>
0
)
{
size_t
area_touched_words
=
pointer_delta
(
s
->
end
(),
s
->
top
());
intptr_t
cur_top
=
(
intptr_t
)
s
->
top
();
CollectedHeap
::
fill_with_object
(
s
->
top
(),
area_touched_words
);
size_t
words_left_to_fill
=
pointer_delta
(
s
->
end
(),
s
->
top
());;
while
(
words_left_to_fill
>
0
)
{
size_t
words_to_fill
=
MIN2
(
words_left_to_fill
,
CollectedHeap
::
filler_array_max_size
());
assert
(
words_to_fill
>=
CollectedHeap
::
min_fill_size
(),
err_msg
(
"Remaining size ("
SIZE_FORMAT
") is too small to fill (based on "
SIZE_FORMAT
" and "
SIZE_FORMAT
")"
,
words_to_fill
,
words_left_to_fill
,
CollectedHeap
::
filler_array_max_size
()));
CollectedHeap
::
fill_with_object
((
HeapWord
*
)
cur_top
,
words_to_fill
);
if
(
!
os
::
numa_has_static_binding
())
{
size_t
touched_words
=
words_to_fill
;
#ifndef ASSERT
#ifndef ASSERT
if
(
!
ZapUnusedHeapArea
)
{
if
(
!
ZapUnusedHeapArea
)
{
area_
touched_words
=
MIN2
((
size_t
)
align_object_size
(
typeArrayOopDesc
::
header_size
(
T_INT
)),
touched_words
=
MIN2
((
size_t
)
align_object_size
(
typeArrayOopDesc
::
header_size
(
T_INT
)),
area_
touched_words
);
touched_words
);
}
}
#endif
#endif
if
(
!
os
::
numa_has_static_binding
())
{
MemRegion
invalid
;
MemRegion
invalid
;
HeapWord
*
crossing_start
=
(
HeapWord
*
)
round_to
(
cur_top
,
os
::
vm_page_size
());
HeapWord
*
crossing_start
=
(
HeapWord
*
)
round_to
((
intptr_t
)
s
->
top
(),
os
::
vm_page_size
());
HeapWord
*
crossing_end
=
(
HeapWord
*
)
round_to
(
cur_top
+
touched_words
,
os
::
vm_page_size
());
HeapWord
*
crossing_end
=
(
HeapWord
*
)
round_to
((
intptr_t
)(
s
->
top
()
+
area_touched_words
),
if
(
crossing_start
!=
crossing_end
)
{
os
::
vm_page_size
());
// If object header crossed a small page boundary we mark the area
if
(
crossing_start
!=
crossing_end
)
{
// as invalid rounding it to a page_size().
// If object header crossed a small page boundary we mark the area
HeapWord
*
start
=
MAX2
((
HeapWord
*
)
round_down
(
cur_top
,
page_size
()),
s
->
bottom
());
// as invalid rounding it to a page_size().
HeapWord
*
end
=
MIN2
((
HeapWord
*
)
round_to
(
cur_top
+
touched_words
,
page_size
()),
s
->
end
());
HeapWord
*
start
=
MAX2
((
HeapWord
*
)
round_down
((
intptr_t
)
s
->
top
(),
page_size
()),
s
->
bottom
());
invalid
=
MemRegion
(
start
,
end
);
HeapWord
*
end
=
MIN2
((
HeapWord
*
)
round_to
((
intptr_t
)(
s
->
top
()
+
area_touched_words
),
page_size
()),
}
s
->
end
());
invalid
=
MemRegion
(
start
,
end
);
}
ls
->
add_invalid_region
(
invalid
);
ls
->
add_invalid_region
(
invalid
);
}
cur_top
=
cur_top
+
(
words_to_fill
*
HeapWordSize
);
words_left_to_fill
-=
words_to_fill
;
}
}
}
}
}
else
{
}
else
{
...
...
src/share/vm/gc_interface/collectedHeap.cpp
浏览文件 @
c18d8b56
...
@@ -85,7 +85,7 @@ CollectedHeap::CollectedHeap() : _n_par_threads(0)
...
@@ -85,7 +85,7 @@ CollectedHeap::CollectedHeap() : _n_par_threads(0)
const
size_t
max_len
=
size_t
(
arrayOopDesc
::
max_array_length
(
T_INT
));
const
size_t
max_len
=
size_t
(
arrayOopDesc
::
max_array_length
(
T_INT
));
const
size_t
elements_per_word
=
HeapWordSize
/
sizeof
(
jint
);
const
size_t
elements_per_word
=
HeapWordSize
/
sizeof
(
jint
);
_filler_array_max_size
=
align_object_size
(
filler_array_hdr_size
()
+
_filler_array_max_size
=
align_object_size
(
filler_array_hdr_size
()
+
max_len
*
elements_per_word
);
max_len
/
elements_per_word
);
_barrier_set
=
NULL
;
_barrier_set
=
NULL
;
_is_gc_active
=
false
;
_is_gc_active
=
false
;
...
@@ -303,10 +303,6 @@ size_t CollectedHeap::filler_array_min_size() {
...
@@ -303,10 +303,6 @@ size_t CollectedHeap::filler_array_min_size() {
return
align_object_size
(
filler_array_hdr_size
());
// align to MinObjAlignment
return
align_object_size
(
filler_array_hdr_size
());
// align to MinObjAlignment
}
}
size_t
CollectedHeap
::
filler_array_max_size
()
{
return
_filler_array_max_size
;
}
#ifdef ASSERT
#ifdef ASSERT
void
CollectedHeap
::
fill_args_check
(
HeapWord
*
start
,
size_t
words
)
void
CollectedHeap
::
fill_args_check
(
HeapWord
*
start
,
size_t
words
)
{
{
...
@@ -333,10 +329,11 @@ CollectedHeap::fill_with_array(HeapWord* start, size_t words, bool zap)
...
@@ -333,10 +329,11 @@ CollectedHeap::fill_with_array(HeapWord* start, size_t words, bool zap)
const
size_t
payload_size
=
words
-
filler_array_hdr_size
();
const
size_t
payload_size
=
words
-
filler_array_hdr_size
();
const
size_t
len
=
payload_size
*
HeapWordSize
/
sizeof
(
jint
);
const
size_t
len
=
payload_size
*
HeapWordSize
/
sizeof
(
jint
);
assert
((
int
)
len
>=
0
,
err_msg
(
"size too large "
SIZE_FORMAT
" becomes %d"
,
words
,
(
int
)
len
));
// Set the length first for concurrent GC.
// Set the length first for concurrent GC.
((
arrayOop
)
start
)
->
set_length
((
int
)
len
);
((
arrayOop
)
start
)
->
set_length
((
int
)
len
);
post_allocation_setup_common
(
Universe
::
intArrayKlassObj
(),
start
,
words
);
post_allocation_setup_common
(
Universe
::
intArrayKlassObj
(),
start
);
DEBUG_ONLY
(
zap_filler_array
(
start
,
words
,
zap
);)
DEBUG_ONLY
(
zap_filler_array
(
start
,
words
,
zap
);)
}
}
...
@@ -349,8 +346,7 @@ CollectedHeap::fill_with_object_impl(HeapWord* start, size_t words, bool zap)
...
@@ -349,8 +346,7 @@ CollectedHeap::fill_with_object_impl(HeapWord* start, size_t words, bool zap)
fill_with_array
(
start
,
words
,
zap
);
fill_with_array
(
start
,
words
,
zap
);
}
else
if
(
words
>
0
)
{
}
else
if
(
words
>
0
)
{
assert
(
words
==
min_fill_size
(),
"unaligned size"
);
assert
(
words
==
min_fill_size
(),
"unaligned size"
);
post_allocation_setup_common
(
SystemDictionary
::
Object_klass
(),
start
,
post_allocation_setup_common
(
SystemDictionary
::
Object_klass
(),
start
);
words
);
}
}
}
}
...
@@ -480,7 +476,7 @@ oop CollectedHeap::Class_obj_allocate(KlassHandle klass, int size, KlassHandle r
...
@@ -480,7 +476,7 @@ oop CollectedHeap::Class_obj_allocate(KlassHandle klass, int size, KlassHandle r
assert
(
ScavengeRootsInCode
>
0
,
"must be"
);
assert
(
ScavengeRootsInCode
>
0
,
"must be"
);
obj
=
common_mem_allocate_init
(
size
,
CHECK_NULL
);
obj
=
common_mem_allocate_init
(
size
,
CHECK_NULL
);
}
}
post_allocation_setup_common
(
klass
,
obj
,
size
);
post_allocation_setup_common
(
klass
,
obj
);
assert
(
Universe
::
is_bootstrapping
()
||
assert
(
Universe
::
is_bootstrapping
()
||
!
((
oop
)
obj
)
->
blueprint
()
->
oop_is_array
(),
"must not be an array"
);
!
((
oop
)
obj
)
->
blueprint
()
->
oop_is_array
(),
"must not be an array"
);
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
...
...
src/share/vm/gc_interface/collectedHeap.hpp
浏览文件 @
c18d8b56
...
@@ -128,7 +128,6 @@ class CollectedHeap : public CHeapObj {
...
@@ -128,7 +128,6 @@ class CollectedHeap : public CHeapObj {
// Reinitialize tlabs before resuming mutators.
// Reinitialize tlabs before resuming mutators.
virtual
void
resize_all_tlabs
();
virtual
void
resize_all_tlabs
();
protected:
// Allocate from the current thread's TLAB, with broken-out slow path.
// Allocate from the current thread's TLAB, with broken-out slow path.
inline
static
HeapWord
*
allocate_from_tlab
(
Thread
*
thread
,
size_t
size
);
inline
static
HeapWord
*
allocate_from_tlab
(
Thread
*
thread
,
size_t
size
);
static
HeapWord
*
allocate_from_tlab_slow
(
Thread
*
thread
,
size_t
size
);
static
HeapWord
*
allocate_from_tlab_slow
(
Thread
*
thread
,
size_t
size
);
...
@@ -150,18 +149,14 @@ class CollectedHeap : public CHeapObj {
...
@@ -150,18 +149,14 @@ class CollectedHeap : public CHeapObj {
inline
static
HeapWord
*
common_permanent_mem_allocate_init
(
size_t
size
,
TRAPS
);
inline
static
HeapWord
*
common_permanent_mem_allocate_init
(
size_t
size
,
TRAPS
);
// Helper functions for (VM) allocation.
// Helper functions for (VM) allocation.
inline
static
void
post_allocation_setup_common
(
KlassHandle
klass
,
inline
static
void
post_allocation_setup_common
(
KlassHandle
klass
,
HeapWord
*
obj
);
HeapWord
*
obj
,
size_t
size
);
inline
static
void
post_allocation_setup_no_klass_install
(
KlassHandle
klass
,
inline
static
void
post_allocation_setup_no_klass_install
(
KlassHandle
klass
,
HeapWord
*
objPtr
,
HeapWord
*
objPtr
);
size_t
size
);
inline
static
void
post_allocation_setup_obj
(
KlassHandle
klass
,
inline
static
void
post_allocation_setup_obj
(
KlassHandle
klass
,
HeapWord
*
obj
);
HeapWord
*
obj
,
size_t
size
);
inline
static
void
post_allocation_setup_array
(
KlassHandle
klass
,
inline
static
void
post_allocation_setup_array
(
KlassHandle
klass
,
HeapWord
*
obj
,
size_t
size
,
HeapWord
*
obj
,
int
length
);
int
length
);
// Clears an allocated object.
// Clears an allocated object.
inline
static
void
init_obj
(
HeapWord
*
obj
,
size_t
size
);
inline
static
void
init_obj
(
HeapWord
*
obj
,
size_t
size
);
...
@@ -169,7 +164,6 @@ class CollectedHeap : public CHeapObj {
...
@@ -169,7 +164,6 @@ class CollectedHeap : public CHeapObj {
// Filler object utilities.
// Filler object utilities.
static
inline
size_t
filler_array_hdr_size
();
static
inline
size_t
filler_array_hdr_size
();
static
inline
size_t
filler_array_min_size
();
static
inline
size_t
filler_array_min_size
();
static
inline
size_t
filler_array_max_size
();
DEBUG_ONLY
(
static
void
fill_args_check
(
HeapWord
*
start
,
size_t
words
);)
DEBUG_ONLY
(
static
void
fill_args_check
(
HeapWord
*
start
,
size_t
words
);)
DEBUG_ONLY
(
static
void
zap_filler_array
(
HeapWord
*
start
,
size_t
words
,
bool
zap
=
true
);)
DEBUG_ONLY
(
static
void
zap_filler_array
(
HeapWord
*
start
,
size_t
words
,
bool
zap
=
true
);)
...
@@ -197,6 +191,10 @@ class CollectedHeap : public CHeapObj {
...
@@ -197,6 +191,10 @@ class CollectedHeap : public CHeapObj {
G1CollectedHeap
G1CollectedHeap
};
};
static
inline
size_t
filler_array_max_size
()
{
return
_filler_array_max_size
;
}
virtual
CollectedHeap
::
Name
kind
()
const
{
return
CollectedHeap
::
Abstract
;
}
virtual
CollectedHeap
::
Name
kind
()
const
{
return
CollectedHeap
::
Abstract
;
}
/**
/**
...
@@ -366,9 +364,7 @@ class CollectedHeap : public CHeapObj {
...
@@ -366,9 +364,7 @@ class CollectedHeap : public CHeapObj {
inline
static
oop
permanent_obj_allocate_no_klass_install
(
KlassHandle
klass
,
inline
static
oop
permanent_obj_allocate_no_klass_install
(
KlassHandle
klass
,
int
size
,
int
size
,
TRAPS
);
TRAPS
);
inline
static
void
post_allocation_install_obj_klass
(
KlassHandle
klass
,
inline
static
void
post_allocation_install_obj_klass
(
KlassHandle
klass
,
oop
obj
);
oop
obj
,
int
size
);
inline
static
oop
permanent_array_allocate
(
KlassHandle
klass
,
int
size
,
int
length
,
TRAPS
);
inline
static
oop
permanent_array_allocate
(
KlassHandle
klass
,
int
size
,
int
length
,
TRAPS
);
// Raw memory allocation facilities
// Raw memory allocation facilities
...
@@ -662,9 +658,6 @@ class CollectedHeap : public CHeapObj {
...
@@ -662,9 +658,6 @@ class CollectedHeap : public CHeapObj {
}
}
}
}
// Allocate GCHeapLog during VM startup
static
void
initialize_heap_log
();
// Heap verification
// Heap verification
virtual
void
verify
(
bool
allow_dirty
,
bool
silent
,
VerifyOption
option
)
=
0
;
virtual
void
verify
(
bool
allow_dirty
,
bool
silent
,
VerifyOption
option
)
=
0
;
...
...
src/share/vm/gc_interface/collectedHeap.inline.hpp
浏览文件 @
c18d8b56
/*
/*
* Copyright (c) 2001, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2001, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -50,15 +50,13 @@
...
@@ -50,15 +50,13 @@
// Inline allocation implementations.
// Inline allocation implementations.
void
CollectedHeap
::
post_allocation_setup_common
(
KlassHandle
klass
,
void
CollectedHeap
::
post_allocation_setup_common
(
KlassHandle
klass
,
HeapWord
*
obj
,
HeapWord
*
obj
)
{
size_t
size
)
{
post_allocation_setup_no_klass_install
(
klass
,
obj
);
post_allocation_setup_no_klass_install
(
klass
,
obj
,
size
);
post_allocation_install_obj_klass
(
klass
,
oop
(
obj
));
post_allocation_install_obj_klass
(
klass
,
oop
(
obj
),
(
int
)
size
);
}
}
void
CollectedHeap
::
post_allocation_setup_no_klass_install
(
KlassHandle
klass
,
void
CollectedHeap
::
post_allocation_setup_no_klass_install
(
KlassHandle
klass
,
HeapWord
*
objPtr
,
HeapWord
*
objPtr
)
{
size_t
size
)
{
oop
obj
=
(
oop
)
objPtr
;
oop
obj
=
(
oop
)
objPtr
;
assert
(
obj
!=
NULL
,
"NULL object pointer"
);
assert
(
obj
!=
NULL
,
"NULL object pointer"
);
...
@@ -71,8 +69,7 @@ void CollectedHeap::post_allocation_setup_no_klass_install(KlassHandle klass,
...
@@ -71,8 +69,7 @@ void CollectedHeap::post_allocation_setup_no_klass_install(KlassHandle klass,
}
}
void
CollectedHeap
::
post_allocation_install_obj_klass
(
KlassHandle
klass
,
void
CollectedHeap
::
post_allocation_install_obj_klass
(
KlassHandle
klass
,
oop
obj
,
oop
obj
)
{
int
size
)
{
// These asserts are kind of complicated because of klassKlass
// These asserts are kind of complicated because of klassKlass
// and the beginning of the world.
// and the beginning of the world.
assert
(
klass
()
!=
NULL
||
!
Universe
::
is_fully_initialized
(),
"NULL klass"
);
assert
(
klass
()
!=
NULL
||
!
Universe
::
is_fully_initialized
(),
"NULL klass"
);
...
@@ -101,9 +98,8 @@ inline void post_allocation_notify(KlassHandle klass, oop obj) {
...
@@ -101,9 +98,8 @@ inline void post_allocation_notify(KlassHandle klass, oop obj) {
}
}
void
CollectedHeap
::
post_allocation_setup_obj
(
KlassHandle
klass
,
void
CollectedHeap
::
post_allocation_setup_obj
(
KlassHandle
klass
,
HeapWord
*
obj
,
HeapWord
*
obj
)
{
size_t
size
)
{
post_allocation_setup_common
(
klass
,
obj
);
post_allocation_setup_common
(
klass
,
obj
,
size
);
assert
(
Universe
::
is_bootstrapping
()
||
assert
(
Universe
::
is_bootstrapping
()
||
!
((
oop
)
obj
)
->
blueprint
()
->
oop_is_array
(),
"must not be an array"
);
!
((
oop
)
obj
)
->
blueprint
()
->
oop_is_array
(),
"must not be an array"
);
// notify jvmti and dtrace
// notify jvmti and dtrace
...
@@ -112,14 +108,13 @@ void CollectedHeap::post_allocation_setup_obj(KlassHandle klass,
...
@@ -112,14 +108,13 @@ void CollectedHeap::post_allocation_setup_obj(KlassHandle klass,
void
CollectedHeap
::
post_allocation_setup_array
(
KlassHandle
klass
,
void
CollectedHeap
::
post_allocation_setup_array
(
KlassHandle
klass
,
HeapWord
*
obj
,
HeapWord
*
obj
,
size_t
size
,
int
length
)
{
int
length
)
{
// Set array length before setting the _klass field
// Set array length before setting the _klass field
// in post_allocation_setup_common() because the klass field
// in post_allocation_setup_common() because the klass field
// indicates that the object is parsable by concurrent GC.
// indicates that the object is parsable by concurrent GC.
assert
(
length
>=
0
,
"length should be non-negative"
);
assert
(
length
>=
0
,
"length should be non-negative"
);
((
arrayOop
)
obj
)
->
set_length
(
length
);
((
arrayOop
)
obj
)
->
set_length
(
length
);
post_allocation_setup_common
(
klass
,
obj
,
size
);
post_allocation_setup_common
(
klass
,
obj
);
assert
(((
oop
)
obj
)
->
blueprint
()
->
oop_is_array
(),
"must be an array"
);
assert
(((
oop
)
obj
)
->
blueprint
()
->
oop_is_array
(),
"must be an array"
);
// notify jvmti and dtrace (must be after length is set for dtrace)
// notify jvmti and dtrace (must be after length is set for dtrace)
post_allocation_notify
(
klass
,
(
oop
)
obj
);
post_allocation_notify
(
klass
,
(
oop
)
obj
);
...
@@ -256,7 +251,7 @@ oop CollectedHeap::obj_allocate(KlassHandle klass, int size, TRAPS) {
...
@@ -256,7 +251,7 @@ oop CollectedHeap::obj_allocate(KlassHandle klass, int size, TRAPS) {
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
HeapWord
*
obj
=
common_mem_allocate_init
(
size
,
CHECK_NULL
);
HeapWord
*
obj
=
common_mem_allocate_init
(
size
,
CHECK_NULL
);
post_allocation_setup_obj
(
klass
,
obj
,
size
);
post_allocation_setup_obj
(
klass
,
obj
);
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
return
(
oop
)
obj
;
return
(
oop
)
obj
;
}
}
...
@@ -269,7 +264,7 @@ oop CollectedHeap::array_allocate(KlassHandle klass,
...
@@ -269,7 +264,7 @@ oop CollectedHeap::array_allocate(KlassHandle klass,
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
HeapWord
*
obj
=
common_mem_allocate_init
(
size
,
CHECK_NULL
);
HeapWord
*
obj
=
common_mem_allocate_init
(
size
,
CHECK_NULL
);
post_allocation_setup_array
(
klass
,
obj
,
size
,
length
);
post_allocation_setup_array
(
klass
,
obj
,
length
);
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
return
(
oop
)
obj
;
return
(
oop
)
obj
;
}
}
...
@@ -283,7 +278,7 @@ oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
...
@@ -283,7 +278,7 @@ oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
assert
(
size
>=
0
,
"int won't convert to size_t"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
HeapWord
*
obj
=
common_mem_allocate_noinit
(
size
,
CHECK_NULL
);
HeapWord
*
obj
=
common_mem_allocate_noinit
(
size
,
CHECK_NULL
);
((
oop
)
obj
)
->
set_klass_gap
(
0
);
((
oop
)
obj
)
->
set_klass_gap
(
0
);
post_allocation_setup_array
(
klass
,
obj
,
size
,
length
);
post_allocation_setup_array
(
klass
,
obj
,
length
);
#ifndef PRODUCT
#ifndef PRODUCT
const
size_t
hs
=
oopDesc
::
header_size
()
+
1
;
const
size_t
hs
=
oopDesc
::
header_size
()
+
1
;
Universe
::
heap
()
->
check_for_non_bad_heap_word_value
(
obj
+
hs
,
size
-
hs
);
Universe
::
heap
()
->
check_for_non_bad_heap_word_value
(
obj
+
hs
,
size
-
hs
);
...
@@ -293,7 +288,7 @@ oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
...
@@ -293,7 +288,7 @@ oop CollectedHeap::array_allocate_nozero(KlassHandle klass,
oop
CollectedHeap
::
permanent_obj_allocate
(
KlassHandle
klass
,
int
size
,
TRAPS
)
{
oop
CollectedHeap
::
permanent_obj_allocate
(
KlassHandle
klass
,
int
size
,
TRAPS
)
{
oop
obj
=
permanent_obj_allocate_no_klass_install
(
klass
,
size
,
CHECK_NULL
);
oop
obj
=
permanent_obj_allocate_no_klass_install
(
klass
,
size
,
CHECK_NULL
);
post_allocation_install_obj_klass
(
klass
,
obj
,
size
);
post_allocation_install_obj_klass
(
klass
,
obj
);
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
((
HeapWord
*
)
obj
,
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
((
HeapWord
*
)
obj
,
size
));
size
));
return
obj
;
return
obj
;
...
@@ -306,7 +301,7 @@ oop CollectedHeap::permanent_obj_allocate_no_klass_install(KlassHandle klass,
...
@@ -306,7 +301,7 @@ oop CollectedHeap::permanent_obj_allocate_no_klass_install(KlassHandle klass,
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
HeapWord
*
obj
=
common_permanent_mem_allocate_init
(
size
,
CHECK_NULL
);
HeapWord
*
obj
=
common_permanent_mem_allocate_init
(
size
,
CHECK_NULL
);
post_allocation_setup_no_klass_install
(
klass
,
obj
,
size
);
post_allocation_setup_no_klass_install
(
klass
,
obj
);
#ifndef PRODUCT
#ifndef PRODUCT
const
size_t
hs
=
oopDesc
::
header_size
();
const
size_t
hs
=
oopDesc
::
header_size
();
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
+
hs
,
size
-
hs
);
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
+
hs
,
size
-
hs
);
...
@@ -322,7 +317,7 @@ oop CollectedHeap::permanent_array_allocate(KlassHandle klass,
...
@@ -322,7 +317,7 @@ oop CollectedHeap::permanent_array_allocate(KlassHandle klass,
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
!
Universe
::
heap
()
->
is_gc_active
(),
"Allocation during gc not allowed"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
assert
(
size
>=
0
,
"int won't convert to size_t"
);
HeapWord
*
obj
=
common_permanent_mem_allocate_init
(
size
,
CHECK_NULL
);
HeapWord
*
obj
=
common_permanent_mem_allocate_init
(
size
,
CHECK_NULL
);
post_allocation_setup_array
(
klass
,
obj
,
size
,
length
);
post_allocation_setup_array
(
klass
,
obj
,
length
);
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
NOT_PRODUCT
(
Universe
::
heap
()
->
check_for_bad_heap_word_value
(
obj
,
size
));
return
(
oop
)
obj
;
return
(
oop
)
obj
;
}
}
...
...
src/share/vm/oops/klass.cpp
浏览文件 @
c18d8b56
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -174,10 +174,9 @@ KlassHandle Klass::base_create_klass(KlassHandle& klass, int size,
...
@@ -174,10 +174,9 @@ KlassHandle Klass::base_create_klass(KlassHandle& klass, int size,
}
}
void
Klass_vtbl
::
post_new_init_klass
(
KlassHandle
&
klass
,
void
Klass_vtbl
::
post_new_init_klass
(
KlassHandle
&
klass
,
klassOop
new_klass
,
klassOop
new_klass
)
const
{
int
size
)
const
{
assert
(
!
new_klass
->
klass_part
()
->
null_vtbl
(),
"Not a complete klass"
);
assert
(
!
new_klass
->
klass_part
()
->
null_vtbl
(),
"Not a complete klass"
);
CollectedHeap
::
post_allocation_install_obj_klass
(
klass
,
new_klass
,
size
);
CollectedHeap
::
post_allocation_install_obj_klass
(
klass
,
new_klass
);
}
}
void
*
Klass_vtbl
::
operator
new
(
size_t
ignored
,
KlassHandle
&
klass
,
void
*
Klass_vtbl
::
operator
new
(
size_t
ignored
,
KlassHandle
&
klass
,
...
...
src/share/vm/oops/klass.hpp
浏览文件 @
c18d8b56
/*
/*
* Copyright (c) 1997, 201
1
, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 201
2
, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
*
* This code is free software; you can redistribute it and/or modify it
* This code is free software; you can redistribute it and/or modify it
...
@@ -149,7 +149,7 @@ class Klass_vtbl {
...
@@ -149,7 +149,7 @@ class Klass_vtbl {
// by the shared "base_create" subroutines.
// by the shared "base_create" subroutines.
//
//
virtual
void
*
allocate_permanent
(
KlassHandle
&
klass
,
int
size
,
TRAPS
)
const
=
0
;
virtual
void
*
allocate_permanent
(
KlassHandle
&
klass
,
int
size
,
TRAPS
)
const
=
0
;
void
post_new_init_klass
(
KlassHandle
&
klass
,
klassOop
obj
,
int
size
)
const
;
void
post_new_init_klass
(
KlassHandle
&
klass
,
klassOop
obj
)
const
;
// Every subclass on which vtbl_value is called must include this macro.
// Every subclass on which vtbl_value is called must include this macro.
// Delay the installation of the klassKlass pointer until after the
// Delay the installation of the klassKlass pointer until after the
...
@@ -160,7 +160,7 @@ class Klass_vtbl {
...
@@ -160,7 +160,7 @@ class Klass_vtbl {
if (HAS_PENDING_EXCEPTION) return NULL; \
if (HAS_PENDING_EXCEPTION) return NULL; \
klassOop new_klass = ((Klass*) result)->as_klassOop(); \
klassOop new_klass = ((Klass*) result)->as_klassOop(); \
OrderAccess::storestore(); \
OrderAccess::storestore(); \
post_new_init_klass(klass_klass, new_klass
, size);
\
post_new_init_klass(klass_klass, new_klass
);
\
return result; \
return result; \
}
}
...
...
test/Makefile
浏览文件 @
c18d8b56
...
@@ -26,6 +26,8 @@
...
@@ -26,6 +26,8 @@
# Makefile to run various jdk tests
# Makefile to run various jdk tests
#
#
GETMIXEDPATH
=
echo
# Get OS/ARCH specifics
# Get OS/ARCH specifics
OSNAME
=
$(
shell
uname
-s
)
OSNAME
=
$(
shell
uname
-s
)
ifeq
($(OSNAME), SunOS)
ifeq
($(OSNAME), SunOS)
...
@@ -60,7 +62,14 @@ ifeq ($(findstring BSD,$(OSNAME)), BSD)
...
@@ -60,7 +62,14 @@ ifeq ($(findstring BSD,$(OSNAME)), BSD)
ARCH
=
i586
ARCH
=
i586
endif
endif
endif
endif
ifeq
($(OSNAME), Windows_NT)
ifeq
($(PLATFORM),)
# detect wether we're running in MKS or cygwin
ifeq
($(OSNAME), Windows_NT)
# MKS
GETMIXEDPATH
=
dosname
-s
endif
ifeq
($(findstring CYGWIN,$(OSNAME)), CYGWIN)
GETMIXEDPATH
=
cygpath
-m
-s
endif
PLATFORM
=
windows
PLATFORM
=
windows
SLASH_JAVA
=
J:
SLASH_JAVA
=
J:
ifeq
($(word 1, $(PROCESSOR_IDENTIFIER)),ia64)
ifeq
($(word 1, $(PROCESSOR_IDENTIFIER)),ia64)
...
@@ -234,11 +243,11 @@ wbapitest: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG)
...
@@ -234,11 +243,11 @@ wbapitest: prep $(JT_HOME) $(PRODUCT_HOME) $(JTREG)
$(JTREG)
-a
-v
:fail,error
\
$(JTREG)
-a
-v
:fail,error
\
$(JTREG_KEY_OPTION)
\
$(JTREG_KEY_OPTION)
\
$(EXTRA_JTREG_OPTIONS)
\
$(EXTRA_JTREG_OPTIONS)
\
-r
:
$(
ABS_TEST_OUTPUT_DIR
)
/JTreport
\
-r
:
$(
shell
$(GETMIXEDPATH)
"
$(ABS_TEST_OUTPUT_DIR)
"
)
/JTreport
\
-w
:
$(
ABS_TEST_OUTPUT_DIR
)
/JTwork
\
-w
:
$(
shell
$(GETMIXEDPATH)
"
$(ABS_TEST_OUTPUT_DIR)
"
)
/JTwork
\
-jdk
:
$(
PRODUCT_HOME
)
\
-jdk
:
$(
shell
$(GETMIXEDPATH)
"
$(PRODUCT_HOME)
"
)
\
$
(
JAVA_OPTIONS:%
=
-vmoption
:%
)
\
$
(
JAVA_OPTIONS:%
=
-vmoption
:%
)
\
$(
TEST_ROOT
)
/sanity
\
$(
shell
$(GETMIXEDPATH)
"
$(TEST_ROOT)
"
)
/sanity
\
||
$(BUNDLE_UP_FAILED)
||
$(BUNDLE_UP_FAILED)
$(BUNDLE_UP)
$(BUNDLE_UP)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录