转自:http://bluedavy.me/?p=166
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import
java.util.*;
public
class
SummaryCase{
public
static
void
main(String[] args)
throws
Exception{
List<Object> caches=
new
ArrayList<Object>();
for
(
int
i=
0
;i<
7
;i++){
caches.add(
new
byte
[
1024
*
1024
*
3
]);
}
caches.clear();
for
(
int
i=
0
;i<
2
;i++){
caches.add(
new
byte
[
1024
*
1024
*
3
]);
}
Thread.sleep(
10000
);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
void
PSScavenge::invoke(){
...
bool
scavenge_was_done = PSScavenge::invoke_no_policy();
PSGCAdaptivePolicyCounters* counters = heap->gc_policy_counters();
if
(UsePerfData)
counters->update_full_follows_scavenge(0);
if
(!scavenge_was_done ||
policy->should_full_GC(heap->old_gen()->free_in_bytes())) {
if
(UsePerfData)
counters->update_full_follows_scavenge(full_follows_scavenge);<
GCCauseSetter gccs(heap, GCCause::_adaptive_size_policy);
if
(UseParallelOldGC) {
PSParallelCompact::invoke_no_policy(
false
);
}
else
{
PSMarkSweep::invoke_no_policy(
false
);
}
}
...
}
PSScavenge::invoke_no_policy{
...
if
(!should_attempt_scavenge()) {
return
false
;
}
...
}
bool
PSScavenge::should_attempt_scavenge() {
...
PSAdaptiveSizePolicy* policy = heap->size_policy();
size_t
avg_promoted = (
size_t
) policy->padded_average_promoted_in_bytes();
size_t
promotion_estimate = MIN2(avg_promoted, young_gen->used_in_bytes());
bool
result = promotion_estimate < old_gen->free_in_bytes();
...
return
result;
}
|
1
2
3
4
5
|
bool
PSAdaptiveSizePolicy::should_full_GC(
size_t
old_free_in_bytes) {
bool
result = padded_average_promoted_in_bytes() > (
float
) old_free_in_bytes;
...
return
result;
}
|