Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_hotspot
提交
911269fc
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看板
提交
911269fc
编写于
3月 26, 2015
作者:
B
brutisso
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
Reviewed-by: tschatzl, mgerdin, ecaspole
上级
ae57b8ba
变更
8
展开全部
隐藏空白更改
内联
并排
Showing
8 changed file
with
503 addition
and
445 deletion
+503
-445
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
+30
-33
src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
+20
-20
src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp
src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp
+363
-166
src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp
src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp
+61
-186
src/share/vm/gc_implementation/g1/g1Log.hpp
src/share/vm/gc_implementation/g1/g1Log.hpp
+6
-0
src/share/vm/gc_implementation/g1/g1RemSet.cpp
src/share/vm/gc_implementation/g1/g1RemSet.cpp
+3
-15
src/share/vm/gc_implementation/g1/g1StringDedup.cpp
src/share/vm/gc_implementation/g1/g1StringDedup.cpp
+18
-24
src/share/vm/gc_implementation/g1/g1StringDedup.hpp
src/share/vm/gc_implementation/g1/g1StringDedup.hpp
+2
-1
未找到文件。
src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp
浏览文件 @
911269fc
...
...
@@ -2299,11 +2299,11 @@ void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
hot_card_cache
->
drain
(
worker_i
,
g1_rem_set
(),
into_cset_dcq
);
DirtyCardQueueSet
&
dcqs
=
JavaThread
::
dirty_card_queue_set
();
in
t
n_completed_buffers
=
0
;
size_
t
n_completed_buffers
=
0
;
while
(
dcqs
.
apply_closure_to_completed_buffer
(
cl
,
worker_i
,
0
,
true
))
{
n_completed_buffers
++
;
}
g1_policy
()
->
phase_times
()
->
record_
update_rs_processed_buffers
(
worker_i
,
n_completed_buffers
);
g1_policy
()
->
phase_times
()
->
record_
thread_work_item
(
G1GCPhaseTimes
::
UpdateRS
,
worker_i
,
n_completed_buffers
);
dcqs
.
clear_n_completed_buffers
();
assert
(
!
dcqs
.
completed_buffers_exist_dirty
(),
"Completed buffers exist!"
);
}
...
...
@@ -3912,10 +3912,10 @@ G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
TraceCPUTime
tcpu
(
G1Log
::
finer
(),
true
,
gclog_or_tty
);
int
active_workers
=
(
G1CollectedHeap
::
use_parallel_gc_threads
()
?
u
int
active_workers
=
(
G1CollectedHeap
::
use_parallel_gc_threads
()
?
workers
()
->
active_workers
()
:
1
);
double
pause_start_sec
=
os
::
elapsedTime
();
g1_policy
()
->
phase_times
()
->
note_gc_start
(
active_workers
);
g1_policy
()
->
phase_times
()
->
note_gc_start
(
active_workers
,
mark_in_progress
()
);
log_gc_header
();
TraceCollectorStats
tcs
(
g1mm
()
->
incremental_collection_counters
());
...
...
@@ -4664,8 +4664,7 @@ public:
void
work
(
uint
worker_id
)
{
if
(
worker_id
>=
_n_workers
)
return
;
// no work needed this round
double
start_time_ms
=
os
::
elapsedTime
()
*
1000.0
;
_g1h
->
g1_policy
()
->
phase_times
()
->
record_gc_worker_start_time
(
worker_id
,
start_time_ms
);
_g1h
->
g1_policy
()
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
GCWorkerStart
,
worker_id
,
os
::
elapsedTime
());
{
ResourceMark
rm
;
...
...
@@ -4745,10 +4744,11 @@ public:
double
start
=
os
::
elapsedTime
();
G1ParEvacuateFollowersClosure
evac
(
_g1h
,
&
pss
,
_queues
,
&
_terminator
);
evac
.
do_void
();
double
elapsed_ms
=
(
os
::
elapsedTime
()
-
start
)
*
1000.0
;
double
term_ms
=
pss
.
term_time
()
*
1000.0
;
_g1h
->
g1_policy
()
->
phase_times
()
->
add_obj_copy_time
(
worker_id
,
elapsed_ms
-
term_ms
);
_g1h
->
g1_policy
()
->
phase_times
()
->
record_termination
(
worker_id
,
term_ms
,
pss
.
term_attempts
());
double
elapsed_sec
=
os
::
elapsedTime
()
-
start
;
double
term_sec
=
pss
.
term_time
();
_g1h
->
g1_policy
()
->
phase_times
()
->
add_time_secs
(
G1GCPhaseTimes
::
ObjCopy
,
worker_id
,
elapsed_sec
-
term_sec
);
_g1h
->
g1_policy
()
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
Termination
,
worker_id
,
term_sec
);
_g1h
->
g1_policy
()
->
phase_times
()
->
record_thread_work_item
(
G1GCPhaseTimes
::
Termination
,
worker_id
,
pss
.
term_attempts
());
}
_g1h
->
g1_policy
()
->
record_thread_age_table
(
pss
.
age_table
());
_g1h
->
update_surviving_young_words
(
pss
.
surviving_young_words
()
+
1
);
...
...
@@ -4764,9 +4764,7 @@ public:
// destructors are executed here and are included as part of the
// "GC Worker Time".
}
double
end_time_ms
=
os
::
elapsedTime
()
*
1000.0
;
_g1h
->
g1_policy
()
->
phase_times
()
->
record_gc_worker_end_time
(
worker_id
,
end_time_ms
);
_g1h
->
g1_policy
()
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
GCWorkerEnd
,
worker_id
,
os
::
elapsedTime
());
}
};
...
...
@@ -4828,27 +4826,20 @@ g1_process_roots(OopClosure* scan_non_heap_roots,
double
obj_copy_time_sec
=
buf_scan_non_heap_roots
.
closure_app_seconds
()
+
buf_scan_non_heap_weak_roots
.
closure_app_seconds
();
g1_policy
()
->
phase_times
()
->
record_obj_copy_time
(
worker_i
,
obj_copy_time_sec
*
1000.0
);
double
ext_root_time_ms
=
((
os
::
elapsedTime
()
-
ext_roots_start
)
-
obj_copy_time_sec
)
*
1000.0
;
g1_policy
()
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
ObjCopy
,
worker_i
,
obj_copy_time_sec
);
g1_policy
()
->
phase_times
()
->
record_ext_root_scan_time
(
worker_i
,
ext_root_time_ms
);
double
ext_root_time_sec
=
os
::
elapsedTime
()
-
ext_roots_start
-
obj_copy_time_sec
;
g1_policy
()
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
ExtRootScan
,
worker_i
,
ext_root_time_sec
);
// During conc marking we have to filter the per-thread SATB buffers
// to make sure we remove any oops into the CSet (which will show up
// as implicitly live).
double
satb_filtering_ms
=
0.0
;
if
(
!
_process_strong_tasks
->
is_task_claimed
(
G1H_PS_filter_satb_buffers
))
{
if
(
mark_in_progress
())
{
double
satb_filter_start
=
os
::
elapsedTime
();
{
G1GCParPhaseTimesTracker
x
(
g1_policy
()
->
phase_times
(),
G1GCPhaseTimes
::
SATBFiltering
,
worker_i
);
if
(
!
_process_strong_tasks
->
is_task_claimed
(
G1H_PS_filter_satb_buffers
)
&&
mark_in_progress
())
{
JavaThread
::
satb_mark_queue_set
().
filter_thread_buffers
();
satb_filtering_ms
=
(
os
::
elapsedTime
()
-
satb_filter_start
)
*
1000.0
;
}
}
g1_policy
()
->
phase_times
()
->
record_satb_filtering_time
(
worker_i
,
satb_filtering_ms
);
// Now scan the complement of the collection set.
G1CodeBlobClosure
scavenge_cs_nmethods
(
scan_non_heap_weak_roots
);
...
...
@@ -5271,7 +5262,8 @@ class G1RedirtyLoggedCardsTask : public AbstractGangTask {
G1RedirtyLoggedCardsTask
(
DirtyCardQueueSet
*
queue
)
:
AbstractGangTask
(
"Redirty Cards"
),
_queue
(
queue
)
{
}
virtual
void
work
(
uint
worker_id
)
{
double
start_time
=
os
::
elapsedTime
();
G1GCPhaseTimes
*
phase_times
=
G1CollectedHeap
::
heap
()
->
g1_policy
()
->
phase_times
();
G1GCParPhaseTimesTracker
x
(
phase_times
,
G1GCPhaseTimes
::
RedirtyCards
,
worker_id
);
RedirtyLoggedCardTableEntryClosure
cl
;
if
(
G1CollectedHeap
::
heap
()
->
use_parallel_gc_threads
())
{
...
...
@@ -5280,9 +5272,7 @@ class G1RedirtyLoggedCardsTask : public AbstractGangTask {
_queue
->
apply_closure_to_all_completed_buffers
(
&
cl
);
}
G1GCPhaseTimes
*
timer
=
G1CollectedHeap
::
heap
()
->
g1_policy
()
->
phase_times
();
timer
->
record_redirty_logged_cards_time_ms
(
worker_id
,
(
os
::
elapsedTime
()
-
start_time
)
*
1000.0
);
timer
->
record_redirty_logged_cards_processed_cards
(
worker_id
,
cl
.
num_processed
());
phase_times
->
record_thread_work_item
(
G1GCPhaseTimes
::
RedirtyCards
,
worker_id
,
cl
.
num_processed
());
}
};
...
...
@@ -5884,12 +5874,14 @@ void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) {
// reported parallel time.
}
G1GCPhaseTimes
*
phase_times
=
g1_policy
()
->
phase_times
();
double
par_time_ms
=
(
end_par_time_sec
-
start_par_time_sec
)
*
1000.0
;
g1_policy
()
->
phase_times
()
->
record_par_time
(
par_time_ms
);
phase_times
->
record_par_time
(
par_time_ms
);
double
code_root_fixup_time_ms
=
(
os
::
elapsedTime
()
-
end_par_time_sec
)
*
1000.0
;
g1_policy
()
->
phase_times
()
->
record_code_root_fixup_time
(
code_root_fixup_time_ms
);
phase_times
->
record_code_root_fixup_time
(
code_root_fixup_time_ms
);
set_par_threads
(
0
);
...
...
@@ -5901,9 +5893,14 @@ void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) {
process_discovered_references
(
n_workers
);
if
(
G1StringDedup
::
is_enabled
())
{
double
fixup_start
=
os
::
elapsedTime
();
G1STWIsAliveClosure
is_alive
(
this
);
G1KeepAliveClosure
keep_alive
(
this
);
G1StringDedup
::
unlink_or_oops_do
(
&
is_alive
,
&
keep_alive
);
G1StringDedup
::
unlink_or_oops_do
(
&
is_alive
,
&
keep_alive
,
true
,
phase_times
);
double
fixup_time_ms
=
(
os
::
elapsedTime
()
-
fixup_start
)
*
1000.0
;
phase_times
->
record_string_dedup_fixup_time
(
fixup_time_ms
);
}
_allocator
->
release_gc_alloc_regions
(
n_workers
,
evacuation_info
);
...
...
src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp
浏览文件 @
911269fc
...
...
@@ -1084,7 +1084,7 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
if
(
update_stats
)
{
double
cost_per_card_ms
=
0.0
;
if
(
_pending_cards
>
0
)
{
cost_per_card_ms
=
phase_times
()
->
average_
last_update_rs_time
(
)
/
(
double
)
_pending_cards
;
cost_per_card_ms
=
phase_times
()
->
average_
time_ms
(
G1GCPhaseTimes
::
UpdateRS
)
/
(
double
)
_pending_cards
;
_cost_per_card_ms_seq
->
add
(
cost_per_card_ms
);
}
...
...
@@ -1092,7 +1092,7 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
double
cost_per_entry_ms
=
0.0
;
if
(
cards_scanned
>
10
)
{
cost_per_entry_ms
=
phase_times
()
->
average_
last_scan_rs_time
(
)
/
(
double
)
cards_scanned
;
cost_per_entry_ms
=
phase_times
()
->
average_
time_ms
(
G1GCPhaseTimes
::
ScanRS
)
/
(
double
)
cards_scanned
;
if
(
_last_gc_was_young
)
{
_cost_per_entry_ms_seq
->
add
(
cost_per_entry_ms
);
}
else
{
...
...
@@ -1134,7 +1134,7 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
double
cost_per_byte_ms
=
0.0
;
if
(
copied_bytes
>
0
)
{
cost_per_byte_ms
=
phase_times
()
->
average_
last_obj_copy_time
(
)
/
(
double
)
copied_bytes
;
cost_per_byte_ms
=
phase_times
()
->
average_
time_ms
(
G1GCPhaseTimes
::
ObjCopy
)
/
(
double
)
copied_bytes
;
if
(
_in_marking_window
)
{
_cost_per_byte_ms_during_cm_seq
->
add
(
cost_per_byte_ms
);
}
else
{
...
...
@@ -1143,8 +1143,8 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
}
double
all_other_time_ms
=
pause_time_ms
-
(
phase_times
()
->
average_
last_update_rs_time
()
+
phase_times
()
->
average_last_scan_rs_time
()
+
phase_times
()
->
average_last_obj_copy_time
()
+
phase_times
()
->
average_last_termination_time
(
));
(
phase_times
()
->
average_
time_ms
(
G1GCPhaseTimes
::
UpdateRS
)
+
phase_times
()
->
average_time_ms
(
G1GCPhaseTimes
::
ScanRS
)
+
phase_times
()
->
average_time_ms
(
G1GCPhaseTimes
::
ObjCopy
)
+
phase_times
()
->
average_time_ms
(
G1GCPhaseTimes
::
Termination
));
double
young_other_time_ms
=
0.0
;
if
(
young_cset_region_length
()
>
0
)
{
...
...
@@ -1185,8 +1185,8 @@ void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, Evacua
// Note that _mmu_tracker->max_gc_time() returns the time in seconds.
double
update_rs_time_goal_ms
=
_mmu_tracker
->
max_gc_time
()
*
MILLIUNITS
*
G1RSetUpdatingPauseTimePercent
/
100.0
;
adjust_concurrent_refinement
(
phase_times
()
->
average_
last_update_rs_time
(
),
phase_times
()
->
sum_
last_update_rs_processed_buffers
(
),
update_rs_time_goal_ms
);
adjust_concurrent_refinement
(
phase_times
()
->
average_
time_ms
(
G1GCPhaseTimes
::
UpdateRS
),
phase_times
()
->
sum_
thread_work_items
(
G1GCPhaseTimes
::
UpdateRS
),
update_rs_time_goal_ms
);
_collectionSetChooser
->
verify
();
}
...
...
@@ -2177,19 +2177,19 @@ void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTim
_other
.
add
(
pause_time_ms
-
phase_times
->
accounted_time_ms
());
_root_region_scan_wait
.
add
(
phase_times
->
root_region_scan_wait_time_ms
());
_parallel
.
add
(
phase_times
->
cur_collection_par_time_ms
());
_ext_root_scan
.
add
(
phase_times
->
average_
last_ext_root_scan_time
(
));
_satb_filtering
.
add
(
phase_times
->
average_
last_satb_filtering_times_ms
(
));
_update_rs
.
add
(
phase_times
->
average_
last_update_rs_time
(
));
_scan_rs
.
add
(
phase_times
->
average_
last_scan_rs_time
(
));
_obj_copy
.
add
(
phase_times
->
average_
last_obj_copy_time
(
));
_termination
.
add
(
phase_times
->
average_
last_termination_time
(
));
double
parallel_known_time
=
phase_times
->
average_
last_ext_root_scan_time
(
)
+
phase_times
->
average_
last_satb_filtering_times_ms
(
)
+
phase_times
->
average_
last_update_rs_time
(
)
+
phase_times
->
average_
last_scan_rs_time
(
)
+
phase_times
->
average_
last_obj_copy_time
(
)
+
+
phase_times
->
average_last_termination_time
(
);
_ext_root_scan
.
add
(
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
ExtRootScan
));
_satb_filtering
.
add
(
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
SATBFiltering
));
_update_rs
.
add
(
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
UpdateRS
));
_scan_rs
.
add
(
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
ScanRS
));
_obj_copy
.
add
(
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
ObjCopy
));
_termination
.
add
(
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
Termination
));
double
parallel_known_time
=
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
ExtRootScan
)
+
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
SATBFiltering
)
+
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
UpdateRS
)
+
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
ScanRS
)
+
phase_times
->
average_
time_ms
(
G1GCPhaseTimes
::
ObjCopy
)
+
phase_times
->
average_time_ms
(
G1GCPhaseTimes
::
Termination
);
double
parallel_other_time
=
phase_times
->
cur_collection_par_time_ms
()
-
parallel_known_time
;
_parallel_other
.
add
(
parallel_other_time
);
...
...
src/share/vm/gc_implementation/g1/g1GCPhaseTimes.cpp
浏览文件 @
911269fc
此差异已折叠。
点击以展开。
src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp
浏览文件 @
911269fc
...
...
@@ -26,106 +26,46 @@
#define SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
#include "memory/allocation.hpp"
#include "gc_interface/gcCause.hpp"
template
<
class
T
>
class
WorkerDataArray
:
public
CHeapObj
<
mtGC
>
{
T
*
_data
;
uint
_length
;
const
char
*
_print_format
;
bool
_print_sum
;
class
LineBuffer
;
NOT_PRODUCT
(
static
const
T
_uninitialized
;)
// We are caching the sum and average to only have to calculate them once.
// This is not done in an MT-safe way. It is intended to allow single
// threaded code to call sum() and average() multiple times in any order
// without having to worry about the cost.
bool
_has_new_data
;
T
_sum
;
double
_average
;
public:
WorkerDataArray
(
uint
length
,
const
char
*
print_format
,
bool
print_sum
=
true
)
:
_length
(
length
),
_print_format
(
print_format
),
_print_sum
(
print_sum
),
_has_new_data
(
true
)
{
assert
(
length
>
0
,
"Must have some workers to store data for"
);
_data
=
NEW_C_HEAP_ARRAY
(
T
,
_length
,
mtGC
);
}
~
WorkerDataArray
()
{
FREE_C_HEAP_ARRAY
(
T
,
_data
,
mtGC
);
}
void
set
(
uint
worker_i
,
T
value
)
{
assert
(
worker_i
<
_length
,
err_msg
(
"Worker %d is greater than max: %d"
,
worker_i
,
_length
));
assert
(
_data
[
worker_i
]
==
(
T
)
-
1
,
err_msg
(
"Overwriting data for worker %d"
,
worker_i
));
_data
[
worker_i
]
=
value
;
_has_new_data
=
true
;
}
T
get
(
uint
worker_i
)
{
assert
(
worker_i
<
_length
,
err_msg
(
"Worker %d is greater than max: %d"
,
worker_i
,
_length
));
assert
(
_data
[
worker_i
]
!=
(
T
)
-
1
,
err_msg
(
"No data to add to for worker %d"
,
worker_i
));
return
_data
[
worker_i
];
}
void
add
(
uint
worker_i
,
T
value
)
{
assert
(
worker_i
<
_length
,
err_msg
(
"Worker %d is greater than max: %d"
,
worker_i
,
_length
));
assert
(
_data
[
worker_i
]
!=
(
T
)
-
1
,
err_msg
(
"No data to add to for worker %d"
,
worker_i
));
_data
[
worker_i
]
+=
value
;
_has_new_data
=
true
;
}
double
average
(){
if
(
_has_new_data
)
{
calculate_totals
();
}
return
_average
;
}
T
sum
()
{
if
(
_has_new_data
)
{
calculate_totals
();
}
return
_sum
;
}
void
print
(
int
level
,
const
char
*
title
);
void
reset
()
PRODUCT_RETURN
;
void
verify
()
PRODUCT_RETURN
;
private:
void
calculate_totals
(){
_sum
=
(
T
)
0
;
for
(
uint
i
=
0
;
i
<
_length
;
++
i
)
{
_sum
+=
_data
[
i
];
}
_average
=
(
double
)
_sum
/
(
double
)
_length
;
_has_new_data
=
false
;
}
};
template
<
class
T
>
class
WorkerDataArray
;
class
G1GCPhaseTimes
:
public
CHeapObj
<
mtGC
>
{
friend
class
G1GCParPhasePrinter
;
private:
uint
_active_gc_threads
;
uint
_max_gc_threads
;
WorkerDataArray
<
double
>
_last_gc_worker_start_times_ms
;
WorkerDataArray
<
double
>
_last_ext_root_scan_times_ms
;
WorkerDataArray
<
double
>
_last_satb_filtering_times_ms
;
WorkerDataArray
<
double
>
_last_update_rs_times_ms
;
WorkerDataArray
<
int
>
_last_update_rs_processed_buffers
;
WorkerDataArray
<
double
>
_last_scan_rs_times_ms
;
WorkerDataArray
<
double
>
_last_strong_code_root_scan_times_ms
;
WorkerDataArray
<
double
>
_last_obj_copy_times_ms
;
WorkerDataArray
<
double
>
_last_termination_times_ms
;
WorkerDataArray
<
size_t
>
_last_termination_attempts
;
WorkerDataArray
<
double
>
_last_gc_worker_end_times_ms
;
WorkerDataArray
<
double
>
_last_gc_worker_times_ms
;
WorkerDataArray
<
double
>
_last_gc_worker_other_times_ms
;
public:
enum
GCParPhases
{
GCWorkerStart
,
ExtRootScan
,
SATBFiltering
,
UpdateRS
,
ScanRS
,
CodeRoots
,
ObjCopy
,
Termination
,
Other
,
GCWorkerTotal
,
GCWorkerEnd
,
StringDedupQueueFixup
,
StringDedupTableFixup
,
RedirtyCards
,
GCParPhasesSentinel
};
private:
// Markers for grouping the phases in the GCPhases enum above
static
const
int
GCMainParPhasesLast
=
GCWorkerEnd
;
static
const
int
StringDedupPhasesFirst
=
StringDedupQueueFixup
;
static
const
int
StringDedupPhasesLast
=
StringDedupTableFixup
;
WorkerDataArray
<
double
>*
_gc_par_phases
[
GCParPhasesSentinel
];
WorkerDataArray
<
size_t
>*
_update_rs_processed_buffers
;
WorkerDataArray
<
size_t
>*
_termination_attempts
;
WorkerDataArray
<
size_t
>*
_redirtied_cards
;
double
_cur_collection_par_time_ms
;
double
_cur_collection_code_root_fixup_time_ms
;
...
...
@@ -135,9 +75,7 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
double
_cur_evac_fail_restore_remsets
;
double
_cur_evac_fail_remove_self_forwards
;
double
_cur_string_dedup_fixup_time_ms
;
WorkerDataArray
<
double
>
_cur_string_dedup_queue_fixup_worker_times_ms
;
WorkerDataArray
<
double
>
_cur_string_dedup_table_fixup_worker_times_ms
;
double
_cur_string_dedup_fixup_time_ms
;
double
_cur_clear_ct_time_ms
;
double
_cur_ref_proc_time_ms
;
...
...
@@ -149,8 +87,6 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
double
_recorded_young_cset_choice_time_ms
;
double
_recorded_non_young_cset_choice_time_ms
;
WorkerDataArray
<
double
>
_last_redirty_logged_cards_time_ms
;
WorkerDataArray
<
size_t
>
_last_redirty_logged_cards_processed_cards
;
double
_recorded_redirty_logged_cards_time_ms
;
double
_recorded_young_free_cset_time_ms
;
...
...
@@ -171,54 +107,34 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
public:
G1GCPhaseTimes
(
uint
max_gc_threads
);
void
note_gc_start
(
uint
active_gc_threads
);
void
note_gc_start
(
uint
active_gc_threads
,
bool
mark_in_progress
);
void
note_gc_end
();
void
print
(
double
pause_time_sec
);
void
record_gc_worker_start_time
(
uint
worker_i
,
double
ms
)
{
_last_gc_worker_start_times_ms
.
set
(
worker_i
,
ms
);
}
void
record_ext_root_scan_time
(
uint
worker_i
,
double
ms
)
{
_last_ext_root_scan_times_ms
.
set
(
worker_i
,
ms
);
}
void
record_satb_filtering_time
(
uint
worker_i
,
double
ms
)
{
_last_satb_filtering_times_ms
.
set
(
worker_i
,
ms
);
}
void
record_update_rs_time
(
uint
worker_i
,
double
ms
)
{
_last_update_rs_times_ms
.
set
(
worker_i
,
ms
);
}
void
record_update_rs_processed_buffers
(
uint
worker_i
,
int
processed_buffers
)
{
_last_update_rs_processed_buffers
.
set
(
worker_i
,
processed_buffers
);
}
// record the time a phase took in seconds
void
record_time_secs
(
GCParPhases
phase
,
uint
worker_i
,
double
secs
);
void
record_scan_rs_time
(
uint
worker_i
,
double
ms
)
{
_last_scan_rs_times_ms
.
set
(
worker_i
,
ms
);
}
// add a number of seconds to a phase
void
add_time_secs
(
GCParPhases
phase
,
uint
worker_i
,
double
secs
);
void
record_strong_code_root_scan_time
(
uint
worker_i
,
double
ms
)
{
_last_strong_code_root_scan_times_ms
.
set
(
worker_i
,
ms
);
}
void
record_thread_work_item
(
GCParPhases
phase
,
uint
worker_i
,
size_t
count
);
void
record_obj_copy_time
(
uint
worker_i
,
double
ms
)
{
_last_obj_copy_times_ms
.
set
(
worker_i
,
ms
);
}
// return the average time for a phase in milliseconds
double
average_time_ms
(
GCParPhases
phase
);
void
add_obj_copy_time
(
uint
worker_i
,
double
ms
)
{
_last_obj_copy_times_ms
.
add
(
worker_i
,
ms
);
}
size_t
sum_thread_work_items
(
GCParPhases
phase
);
void
record_termination
(
uint
worker_i
,
double
ms
,
size_t
attempts
)
{
_last_termination_times_ms
.
set
(
worker_i
,
ms
);
_last_termination_attempts
.
set
(
worker_i
,
attempts
);
}
private:
double
get_time_ms
(
GCParPhases
phase
,
uint
worker_i
);
double
sum_time_ms
(
GCParPhases
phase
);
double
min_time_ms
(
GCParPhases
phase
);
double
max_time_ms
(
GCParPhases
phase
);
size_t
get_thread_work_item
(
GCParPhases
phase
,
uint
worker_i
);
double
average_thread_work_items
(
GCParPhases
phase
);
size_t
min_thread_work_items
(
GCParPhases
phase
);
size_t
max_thread_work_items
(
GCParPhases
phase
);
void
record_gc_worker_end_time
(
uint
worker_i
,
double
ms
)
{
_last_gc_worker_end_times_ms
.
set
(
worker_i
,
ms
);
}
public:
void
record_clear_ct_time
(
double
ms
)
{
_cur_clear_ct_time_ms
=
ms
;
...
...
@@ -248,21 +164,10 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
_cur_evac_fail_remove_self_forwards
=
ms
;
}
void
note_string_dedup_fixup_start
();
void
note_string_dedup_fixup_end
();
void
record_string_dedup_fixup_time
(
double
ms
)
{
_cur_string_dedup_fixup_time_ms
=
ms
;
}
void
record_string_dedup_queue_fixup_worker_time
(
uint
worker_id
,
double
ms
)
{
_cur_string_dedup_queue_fixup_worker_times_ms
.
set
(
worker_id
,
ms
);
}
void
record_string_dedup_table_fixup_worker_time
(
uint
worker_id
,
double
ms
)
{
_cur_string_dedup_table_fixup_worker_times_ms
.
set
(
worker_id
,
ms
);
}
void
record_ref_proc_time
(
double
ms
)
{
_cur_ref_proc_time_ms
=
ms
;
}
...
...
@@ -301,14 +206,6 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
_recorded_non_young_cset_choice_time_ms
=
time_ms
;
}
void
record_redirty_logged_cards_time_ms
(
uint
worker_i
,
double
time_ms
)
{
_last_redirty_logged_cards_time_ms
.
set
(
worker_i
,
time_ms
);
}
void
record_redirty_logged_cards_processed_cards
(
uint
worker_i
,
size_t
processed_buffers
)
{
_last_redirty_logged_cards_processed_cards
.
set
(
worker_i
,
processed_buffers
);
}
void
record_redirty_logged_cards_time_ms
(
double
time_ms
)
{
_recorded_redirty_logged_cards_time_ms
=
time_ms
;
}
...
...
@@ -362,38 +259,16 @@ class G1GCPhaseTimes : public CHeapObj<mtGC> {
double
fast_reclaim_humongous_time_ms
()
{
return
_cur_fast_reclaim_humongous_time_ms
;
}
};
double
average_last_update_rs_time
()
{
return
_last_update_rs_times_ms
.
average
();
}
int
sum_last_update_rs_processed_buffers
()
{
return
_last_update_rs_processed_buffers
.
sum
();
}
double
average_last_scan_rs_time
(){
return
_last_scan_rs_times_ms
.
average
();
}
double
average_last_strong_code_root_scan_time
(){
return
_last_strong_code_root_scan_times_ms
.
average
();
}
double
average_last_obj_copy_time
()
{
return
_last_obj_copy_times_ms
.
average
();
}
double
average_last_termination_time
()
{
return
_last_termination_times_ms
.
average
();
}
double
average_last_ext_root_scan_time
()
{
return
_last_ext_root_scan_times_ms
.
average
();
}
double
average_last_satb_filtering_times_ms
()
{
return
_last_satb_filtering_times_ms
.
average
();
}
class
G1GCParPhaseTimesTracker
:
public
StackObj
{
double
_start_time
;
G1GCPhaseTimes
::
GCParPhases
_phase
;
G1GCPhaseTimes
*
_phase_times
;
uint
_worker_id
;
public:
G1GCParPhaseTimesTracker
(
G1GCPhaseTimes
*
phase_times
,
G1GCPhaseTimes
::
GCParPhases
phase
,
uint
worker_id
);
~
G1GCParPhaseTimesTracker
();
};
#endif // SHARE_VM_GC_IMPLEMENTATION_G1_G1GCPHASETIMESLOG_HPP
src/share/vm/gc_implementation/g1/g1Log.hpp
浏览文件 @
911269fc
...
...
@@ -28,6 +28,7 @@
#include "memory/allocation.hpp"
class
G1Log
:
public
AllStatic
{
public:
typedef
enum
{
LevelNone
,
LevelFine
,
...
...
@@ -35,6 +36,7 @@ class G1Log : public AllStatic {
LevelFinest
}
LogLevel
;
private:
static
LogLevel
_level
;
public:
...
...
@@ -50,6 +52,10 @@ class G1Log : public AllStatic {
return
_level
==
LevelFinest
;
}
static
LogLevel
level
()
{
return
_level
;
}
static
void
init
();
};
...
...
src/share/vm/gc_implementation/g1/g1RemSet.cpp
浏览文件 @
911269fc
...
...
@@ -255,9 +255,8 @@ void G1RemSet::scanRS(G1ParPushHeapRSClosure* oc,
assert
(
_cards_scanned
!=
NULL
,
"invariant"
);
_cards_scanned
[
worker_i
]
=
scanRScl
.
cards_done
();
_g1p
->
phase_times
()
->
record_scan_rs_time
(
worker_i
,
scan_rs_time_sec
*
1000.0
);
_g1p
->
phase_times
()
->
record_strong_code_root_scan_time
(
worker_i
,
scanRScl
.
strong_code_root_scan_time_sec
()
*
1000.0
);
_g1p
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
ScanRS
,
worker_i
,
scan_rs_time_sec
);
_g1p
->
phase_times
()
->
record_time_secs
(
G1GCPhaseTimes
::
CodeRoots
,
worker_i
,
scanRScl
.
strong_code_root_scan_time_sec
());
}
// Closure used for updating RSets and recording references that
...
...
@@ -294,22 +293,11 @@ public:
};
void
G1RemSet
::
updateRS
(
DirtyCardQueue
*
into_cset_dcq
,
uint
worker_i
)
{
double
start
=
os
::
elapsedTime
(
);
G1GCParPhaseTimesTracker
x
(
_g1p
->
phase_times
(),
G1GCPhaseTimes
::
UpdateRS
,
worker_i
);
// Apply the given closure to all remaining log entries.
RefineRecordRefsIntoCSCardTableEntryClosure
into_cset_update_rs_cl
(
_g1
,
into_cset_dcq
);
_g1
->
iterate_dirty_card_closure
(
&
into_cset_update_rs_cl
,
into_cset_dcq
,
false
,
worker_i
);
// Now there should be no dirty cards.
if
(
G1RSLogCheckCardTable
)
{
CountNonCleanMemRegionClosure
cl
(
_g1
);
_ct_bs
->
mod_card_iterate
(
&
cl
);
// XXX This isn't true any more: keeping cards of young regions
// marked dirty broke it. Need some reasonable fix.
guarantee
(
cl
.
n
()
==
0
,
"Card table should be clean."
);
}
_g1p
->
phase_times
()
->
record_update_rs_time
(
worker_i
,
(
os
::
elapsedTime
()
-
start
)
*
1000.0
);
}
void
G1RemSet
::
cleanupHRRS
()
{
...
...
src/share/vm/gc_implementation/g1/g1StringDedup.cpp
浏览文件 @
911269fc
...
...
@@ -105,7 +105,7 @@ void G1StringDedup::deduplicate(oop java_string) {
void
G1StringDedup
::
oops_do
(
OopClosure
*
keep_alive
)
{
assert
(
is_enabled
(),
"String deduplication not enabled"
);
unlink_or_oops_do
(
NULL
,
keep_alive
);
unlink_or_oops_do
(
NULL
,
keep_alive
,
true
/* allow_resize_and_rehash */
);
}
void
G1StringDedup
::
unlink
(
BoolObjectClosure
*
is_alive
)
{
...
...
@@ -122,37 +122,35 @@ void G1StringDedup::unlink(BoolObjectClosure* is_alive) {
class
G1StringDedupUnlinkOrOopsDoTask
:
public
AbstractGangTask
{
private:
G1StringDedupUnlinkOrOopsDoClosure
_cl
;
G1GCPhaseTimes
*
_phase_times
;
public:
G1StringDedupUnlinkOrOopsDoTask
(
BoolObjectClosure
*
is_alive
,
OopClosure
*
keep_alive
,
bool
allow_resize_and_rehash
)
:
bool
allow_resize_and_rehash
,
G1GCPhaseTimes
*
phase_times
)
:
AbstractGangTask
(
"G1StringDedupUnlinkOrOopsDoTask"
),
_cl
(
is_alive
,
keep_alive
,
allow_resize_and_rehash
)
{
}
_cl
(
is_alive
,
keep_alive
,
allow_resize_and_rehash
),
_phase_times
(
phase_times
)
{
}
virtual
void
work
(
uint
worker_id
)
{
double
queue_fixup_start
=
os
::
elapsedTime
();
G1StringDedupQueue
::
unlink_or_oops_do
(
&
_cl
);
double
table_fixup_start
=
os
::
elapsedTime
();
G1StringDedupTable
::
unlink_or_oops_do
(
&
_cl
,
worker_id
);
double
queue_fixup_time_ms
=
(
table_fixup_start
-
queue_fixup_start
)
*
1000.0
;
double
table_fixup_time_ms
=
(
os
::
elapsedTime
()
-
table_fixup_start
)
*
1000.0
;
G1CollectorPolicy
*
g1p
=
G1CollectedHeap
::
heap
()
->
g1_policy
();
g1p
->
phase_times
()
->
record_string_dedup_queue_fixup_worker_time
(
worker_id
,
queue_fixup_time_ms
);
g1p
->
phase_times
()
->
record_string_dedup_table_fixup_worker_time
(
worker_id
,
table_fixup_time_ms
);
{
G1GCParPhaseTimesTracker
x
(
_phase_times
,
G1GCPhaseTimes
::
StringDedupQueueFixup
,
worker_id
);
G1StringDedupQueue
::
unlink_or_oops_do
(
&
_cl
);
}
{
G1GCParPhaseTimesTracker
x
(
_phase_times
,
G1GCPhaseTimes
::
StringDedupTableFixup
,
worker_id
);
G1StringDedupTable
::
unlink_or_oops_do
(
&
_cl
,
worker_id
);
}
}
};
void
G1StringDedup
::
unlink_or_oops_do
(
BoolObjectClosure
*
is_alive
,
OopClosure
*
keep_alive
,
bool
allow_resize_and_rehash
)
{
void
G1StringDedup
::
unlink_or_oops_do
(
BoolObjectClosure
*
is_alive
,
OopClosure
*
keep_alive
,
bool
allow_resize_and_rehash
,
G1GCPhaseTimes
*
phase_times
)
{
assert
(
is_enabled
(),
"String deduplication not enabled"
);
G1CollectorPolicy
*
g1p
=
G1CollectedHeap
::
heap
()
->
g1_policy
();
g1p
->
phase_times
()
->
note_string_dedup_fixup_start
();
double
fixup_start
=
os
::
elapsedTime
();
G1StringDedupUnlinkOrOopsDoTask
task
(
is_alive
,
keep_alive
,
allow_resize_and_rehash
);
G1StringDedupUnlinkOrOopsDoTask
task
(
is_alive
,
keep_alive
,
allow_resize_and_rehash
,
phase_times
);
if
(
G1CollectedHeap
::
use_parallel_gc_threads
())
{
G1CollectedHeap
*
g1h
=
G1CollectedHeap
::
heap
();
g1h
->
set_par_threads
();
...
...
@@ -161,10 +159,6 @@ void G1StringDedup::unlink_or_oops_do(BoolObjectClosure* is_alive, OopClosure* k
}
else
{
task
.
work
(
0
);
}
double
fixup_time_ms
=
(
os
::
elapsedTime
()
-
fixup_start
)
*
1000.0
;
g1p
->
phase_times
()
->
record_string_dedup_fixup_time
(
fixup_time_ms
);
g1p
->
phase_times
()
->
note_string_dedup_fixup_end
();
}
void
G1StringDedup
::
threads_do
(
ThreadClosure
*
tc
)
{
...
...
src/share/vm/gc_implementation/g1/g1StringDedup.hpp
浏览文件 @
911269fc
...
...
@@ -90,6 +90,7 @@ class BoolObjectClosure;
class
ThreadClosure
;
class
outputStream
;
class
G1StringDedupTable
;
class
G1GCPhaseTimes
;
//
// Main interface for interacting with string deduplication.
...
...
@@ -130,7 +131,7 @@ public:
static
void
oops_do
(
OopClosure
*
keep_alive
);
static
void
unlink
(
BoolObjectClosure
*
is_alive
);
static
void
unlink_or_oops_do
(
BoolObjectClosure
*
is_alive
,
OopClosure
*
keep_alive
,
bool
allow_resize_and_rehash
=
true
);
bool
allow_resize_and_rehash
,
G1GCPhaseTimes
*
phase_times
=
NULL
);
static
void
threads_do
(
ThreadClosure
*
tc
);
static
void
print_worker_threads_on
(
outputStream
*
st
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录