annotate src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp @ 17833:bfdf528be8e8

8038498: Fix includes and C inlining after 8035330 Summary: Change 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure broke the debug build on AIX. The method do_oop_partial_array() is added in a header, but requires the inline function par_write_ref() through several inlined calls. In some cpp files, like arguments.cpp, par_write_ref() is not defined as the corresponding inline header and is not included. The AIX debug VM does not start because of the missing symbol. This change solves this by cleaning up include dependencies. Reviewed-by: tschatzl, stefank
author tschatzl
date Fri, 04 Apr 2014 10:43:56 +0200
parents 8f07aa079343
children 284953caf7aa 270d7cb38f40
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1 /*
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
2 * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
7 * published by the Free Software Foundation.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
8 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
13 * accompanied this code).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
14 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1394
diff changeset
21 * questions.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
22 *
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
23 */
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
26 #include "gc_implementation/g1/concurrentG1Refine.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
27 #include "gc_implementation/g1/concurrentMark.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
28 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
29 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
30 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
31 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
32 #include "gc_implementation/g1/g1GCPhaseTimes.hpp"
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5988
diff changeset
33 #include "gc_implementation/g1/g1Log.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
34 #include "gc_implementation/g1/heapRegionRemSet.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
35 #include "gc_implementation/shared/gcPolicyCounters.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
36 #include "runtime/arguments.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
37 #include "runtime/java.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
38 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1833
diff changeset
39 #include "utilities/debug.hpp"
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
40
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
41 // Different defaults for different number of GC threads
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
42 // They were chosen by running GCOld and SPECjbb on debris with different
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
43 // numbers of GC threads and choosing them based on the results
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
44
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
45 // all the same
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
46 static double rs_length_diff_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
47 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
48 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
49
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
50 static double cost_per_card_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
51 0.01, 0.005, 0.005, 0.003, 0.003, 0.002, 0.002, 0.0015
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
52 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
53
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
54 // all the same
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
55 static double young_cards_per_entry_ratio_defaults[] = {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
56 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
57 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
58
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
59 static double cost_per_entry_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
60 0.015, 0.01, 0.01, 0.008, 0.008, 0.0055, 0.0055, 0.005
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
61 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
62
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
63 static double cost_per_byte_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
64 0.00006, 0.00003, 0.00003, 0.000015, 0.000015, 0.00001, 0.00001, 0.000009
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
65 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
66
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
67 // these should be pretty consistent
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
68 static double constant_other_time_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
69 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
71
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
72
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 static double young_other_cost_per_region_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 0.3, 0.2, 0.2, 0.15, 0.15, 0.12, 0.12, 0.1
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
76
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 static double non_young_other_cost_per_region_ms_defaults[] = {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 1.0, 0.7, 0.7, 0.5, 0.5, 0.42, 0.42, 0.30
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
79 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
80
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 G1CollectorPolicy::G1CollectorPolicy() :
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
82 _parallel_gc_threads(G1CollectedHeap::use_parallel_gc_threads()
3823
14a2fd14c0db 7068240: G1: Long "parallel other time" and "ext root scanning" when running specific benchmark
johnc
parents: 3778
diff changeset
83 ? ParallelGCThreads : 1),
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
84
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
85 _recent_gc_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
86 _stop_world_start(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
87
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88 _concurrent_mark_remark_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 _concurrent_mark_cleanup_times_ms(new TruncatedSeq(NumPrevPausesForHeuristics)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
90
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
91 _alloc_rate_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92 _prev_collection_pause_end_ms(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
93 _rs_length_diff_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
94 _cost_per_card_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
95 _young_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
96 _mixed_cards_per_entry_ratio_seq(new TruncatedSeq(TruncatedSeqLength)),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
97 _cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
98 _mixed_cost_per_entry_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
99 _cost_per_byte_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
100 _cost_per_byte_ms_during_cm_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
101 _constant_other_time_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
102 _young_other_cost_per_region_ms_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
103 _non_young_other_cost_per_region_ms_seq(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
106 _pending_cards_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107 _rs_lengths_seq(new TruncatedSeq(TruncatedSeqLength)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
109 _pause_time_target_ms((double) MaxGCPauseMillis),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
110
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
111 _gcs_are_young(true),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
112
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
113 _during_marking(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114 _in_marking_window(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 _in_marking_window_im(false),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
116
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
117 _recent_prev_end_times_for_all_gcs_sec(
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
118 new TruncatedSeq(NumPrevPausesForHeuristics)),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
119
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
120 _recent_avg_pause_time_ratio(0.0),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
122 _initiate_conc_mark_if_possible(false),
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
123 _during_initial_mark_pause(false),
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
124 _last_young_gc(false),
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
125 _last_gc_was_young(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
126
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
127 _eden_used_bytes_before_gc(0),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
128 _survivor_used_bytes_before_gc(0),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
129 _heap_used_bytes_before_gc(0),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
130 _metaspace_used_bytes_before_gc(0),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
131 _eden_capacity_bytes_before_gc(0),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
132 _heap_capacity_bytes_before_gc(0),
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
133
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
134 _eden_cset_region_length(0),
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
135 _survivor_cset_region_length(0),
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
136 _old_cset_region_length(0),
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
137
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
138 _collection_set(NULL),
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
139 _collection_set_bytes_used_before(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
140
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
141 // Incremental CSet attributes
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
142 _inc_cset_build_state(Inactive),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
143 _inc_cset_head(NULL),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
144 _inc_cset_tail(NULL),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
145 _inc_cset_bytes_used_before(0),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
146 _inc_cset_max_finger(NULL),
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
147 _inc_cset_recorded_rs_lengths(0),
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
148 _inc_cset_recorded_rs_lengths_diffs(0),
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
149 _inc_cset_predicted_elapsed_time_ms(0.0),
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
150 _inc_cset_predicted_elapsed_time_ms_diffs(0.0),
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
151
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
152 #ifdef _MSC_VER // the use of 'this' below gets a warning, make it go away
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
153 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
154 #endif // _MSC_VER
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
155
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
156 _short_lived_surv_rate_group(new SurvRateGroup(this, "Short Lived",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
157 G1YoungSurvRateNumRegionsSummary)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
158 _survivor_surv_rate_group(new SurvRateGroup(this, "Survivor",
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
159 G1YoungSurvRateNumRegionsSummary)),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 // add here any more surv rate groups
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
161 _recorded_survivor_regions(0),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
162 _recorded_survivor_head(NULL),
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
163 _recorded_survivor_tail(NULL),
1356
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
164 _survivors_age_table(true),
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
165
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
166 _gc_overhead_perc(0.0) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
167
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
168 // Set up the region size and associated fields. Given that the
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
169 // policy is created before the heap, we have to set this up here,
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
170 // so it's done as soon as possible.
12178
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
171
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
172 // It would have been natural to pass initial_heap_byte_size() and
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
173 // max_heap_byte_size() to setup_heap_region_size() but those have
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
174 // not been set up at this point since they should be aligned with
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
175 // the region size. So, there is a circular dependency here. We base
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
176 // the region size on the heap size, but the heap size should be
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
177 // aligned with the region size. To get around this we use the
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
178 // unaligned values for the heap.
84683e78e713 8019902: G1: Use the average heap size rather than the minimum heap size to calculate the region size
brutisso
parents: 12110
diff changeset
179 HeapRegion::setup_heap_region_size(InitialHeapSize, MaxHeapSize);
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1111
diff changeset
180 HeapRegionRemSet::setup_remset_size();
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 936
diff changeset
181
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
182 G1ErgoVerbose::initialize();
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
183 if (PrintAdaptiveSizePolicy) {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
184 // Currently, we only use a single switch for all the heuristics.
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
185 G1ErgoVerbose::set_enabled(true);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
186 // Given that we don't currently have a verboseness level
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
187 // parameter, we'll hardcode this to high. This can be easily
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
188 // changed in the future.
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
189 G1ErgoVerbose::set_level(ErgoHigh);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
190 } else {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
191 G1ErgoVerbose::set_enabled(false);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
192 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
193
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
194 // Verify PLAB sizes
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3982
diff changeset
195 const size_t region_size = HeapRegion::GrainWords;
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
196 if (YoungPLABSize > region_size || OldPLABSize > region_size) {
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
197 char buffer[128];
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3982
diff changeset
198 jio_snprintf(buffer, sizeof(buffer), "%sPLABSize should be at most "SIZE_FORMAT,
1391
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
199 OldPLABSize > region_size ? "Old" : "Young", region_size);
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
200 vm_exit_during_initialization(buffer);
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
201 }
79e419e5ea3b 6942253: G1: replace G1ParallelGCAllocBufferSize with YoungPLABSize and OldPLABSize
apetrusenko
parents: 1388
diff changeset
202
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
203 _recent_prev_end_times_for_all_gcs_sec->add(os::elapsedTime());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 _prev_collection_pause_end_ms = os::elapsedTime() * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
206 _phase_times = new G1GCPhaseTimes(_parallel_gc_threads);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
208 int index = MIN2(_parallel_gc_threads - 1, 7);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210 _rs_length_diff_seq->add(rs_length_diff_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 _cost_per_card_ms_seq->add(cost_per_card_ms_defaults[index]);
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
212 _young_cards_per_entry_ratio_seq->add(
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
213 young_cards_per_entry_ratio_defaults[index]);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214 _cost_per_entry_ms_seq->add(cost_per_entry_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 _cost_per_byte_ms_seq->add(cost_per_byte_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 _constant_other_time_ms_seq->add(constant_other_time_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
217 _young_other_cost_per_region_ms_seq->add(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 young_other_cost_per_region_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219 _non_young_other_cost_per_region_ms_seq->add(
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 non_young_other_cost_per_region_ms_defaults[index]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221
1610
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
222 // Below, we might need to calculate the pause time target based on
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
223 // the pause interval. When we do so we are going to give G1 maximum
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
224 // flexibility and allow it to do pauses when it needs to. So, we'll
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
225 // arrange that the pause interval to be pause time target + 1 to
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
226 // ensure that a) the pause time target is maximized with respect to
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
227 // the pause interval and b) we maintain the invariant that pause
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
228 // time target < pause interval. If the user does not want this
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
229 // maximum flexibility, they will have to set the pause interval
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
230 // explicitly.
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
231
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
232 // First make sure that, if either parameter is set, its value is
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
233 // reasonable.
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
234 if (!FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
235 if (MaxGCPauseMillis < 1) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
236 vm_exit_during_initialization("MaxGCPauseMillis should be "
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
237 "greater than 0");
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
238 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
239 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
240 if (!FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
241 if (GCPauseIntervalMillis < 1) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
242 vm_exit_during_initialization("GCPauseIntervalMillis should be "
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
243 "greater than 0");
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
244 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
245 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
246
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
247 // Then, if the pause time target parameter was not set, set it to
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
248 // the default value.
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
249 if (FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
250 if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
251 // The default pause time target in G1 is 200ms
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
252 FLAG_SET_DEFAULT(MaxGCPauseMillis, 200);
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
253 } else {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
254 // We do not allow the pause interval to be set without the
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
255 // pause time target
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
256 vm_exit_during_initialization("GCPauseIntervalMillis cannot be set "
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
257 "without setting MaxGCPauseMillis");
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
258 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
259 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
260
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
261 // Then, if the interval parameter was not set, set it according to
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
262 // the pause time target (this will also deal with the case when the
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
263 // pause time target is the default value).
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
264 if (FLAG_IS_DEFAULT(GCPauseIntervalMillis)) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
265 FLAG_SET_DEFAULT(GCPauseIntervalMillis, MaxGCPauseMillis + 1);
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
266 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
267
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
268 // Finally, make sure that the two parameters are consistent.
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
269 if (MaxGCPauseMillis >= GCPauseIntervalMillis) {
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
270 char buffer[256];
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
271 jio_snprintf(buffer, 256,
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
272 "MaxGCPauseMillis (%u) should be less than "
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
273 "GCPauseIntervalMillis (%u)",
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
274 MaxGCPauseMillis, GCPauseIntervalMillis);
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
275 vm_exit_during_initialization(buffer);
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
276 }
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
277
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
278 double max_gc_time = (double) MaxGCPauseMillis / 1000.0;
1610
79107c3a6bd5 6949307: G1: raise a vm error, do not core dump, if target pause time and target interval are inconsistent
tonyp
parents: 1579
diff changeset
279 double time_slice = (double) GCPauseIntervalMillis / 1000.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
280 _mmu_tracker = new G1MMUTrackerQueue(time_slice, max_gc_time);
8094
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
281
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
282 uintx confidence_perc = G1ConfidencePercent;
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
283 // Put an artificial ceiling on this so that it's not set to a silly value.
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
284 if (confidence_perc > 100) {
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
285 confidence_perc = 100;
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
286 warning("G1ConfidencePercent is set to a value that is too large, "
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
287 "it's been updated to %u", confidence_perc);
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
288 }
f1fb03a251e9 8008546: Wrong G1ConfidencePercent results in GUARANTEE(VARIANCE() > -1.0) FAILED
poonam
parents: 7449
diff changeset
289 _sigma = (double) confidence_perc / 100.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
290
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
291 // start conservatively (around 50ms is about right)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
292 _concurrent_mark_remark_times_ms->add(0.05);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
293 _concurrent_mark_cleanup_times_ms->add(0.20);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
294 _tenuring_threshold = MaxTenuringThreshold;
3868
ae73da50be4b 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 3867
diff changeset
295 // _max_survivor_regions will be calculated by
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
296 // update_young_list_target_length() during initialization.
3868
ae73da50be4b 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 3867
diff changeset
297 _max_survivor_regions = 0;
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
298
1356
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
299 assert(GCTimeRatio > 0,
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
300 "we should have set it to a default value set_g1_gc_flags() "
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
301 "if a user set it to 0");
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
302 _gc_overhead_perc = 100.0 * (1.0 / (1.0 + GCTimeRatio));
56507bcd639e 6937160: G1: should observe GCTimeRatio
tonyp
parents: 1285
diff changeset
303
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
304 uintx reserve_perc = G1ReservePercent;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
305 // Put an artificial ceiling on this so that it's not set to a silly value.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
306 if (reserve_perc > 50) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
307 reserve_perc = 50;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
308 warning("G1ReservePercent is set to a value that is too large, "
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
309 "it's been updated to %u", reserve_perc);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
310 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
311 _reserve_factor = (double) reserve_perc / 100.0;
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
312 // This will be set when the heap is expanded
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
313 // for the first time during initialization.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
314 _reserve_regions = 0;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
315
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
316 _collectionSetChooser = new CollectionSetChooser();
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
317 }
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
318
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
319 void G1CollectorPolicy::initialize_alignments() {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
320 _space_alignment = HeapRegion::GrainBytes;
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
321 size_t card_table_alignment = GenRemSet::max_alignment_constraint(GenRemSet::CardTable);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
322 size_t page_size = UseLargePages ? os::large_page_size() : os::vm_page_size();
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
323 _heap_alignment = MAX3(card_table_alignment, _space_alignment, page_size);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
324 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
325
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
326 void G1CollectorPolicy::initialize_flags() {
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
327 if (G1HeapRegionSize != HeapRegion::GrainBytes) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
328 FLAG_SET_ERGO(uintx, G1HeapRegionSize, HeapRegion::GrainBytes);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
329 }
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
330
547
1e458753107d 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 545
diff changeset
331 if (SurvivorRatio < 1) {
1e458753107d 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 545
diff changeset
332 vm_exit_during_initialization("Invalid survivor ratio specified");
1e458753107d 6802413: G1: G1FixedSurvivorSpaceSize should be converted into regions in calculate_survivors_policy()
apetrusenko
parents: 545
diff changeset
333 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
334 CollectorPolicy::initialize_flags();
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
335 _young_gen_sizer = new G1YoungGenSizer(); // Must be after call to initialize_flags
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
337
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
338 void G1CollectorPolicy::post_heap_initialize() {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
339 uintx max_regions = G1CollectedHeap::heap()->max_regions();
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
340 size_t max_young_size = (size_t)_young_gen_sizer->max_young_length(max_regions) * HeapRegion::GrainBytes;
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
341 if (max_young_size != MaxNewSize) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
342 FLAG_SET_ERGO(uintx, MaxNewSize, max_young_size);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
343 }
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
344 }
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
345
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
346 G1YoungGenSizer::G1YoungGenSizer() : _sizer_kind(SizerDefaults), _adaptive_size(true),
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
347 _min_desired_young_length(0), _max_desired_young_length(0) {
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
348 if (FLAG_IS_CMDLINE(NewRatio)) {
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
349 if (FLAG_IS_CMDLINE(NewSize) || FLAG_IS_CMDLINE(MaxNewSize)) {
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
350 warning("-XX:NewSize and -XX:MaxNewSize override -XX:NewRatio");
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
351 } else {
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
352 _sizer_kind = SizerNewRatio;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
353 _adaptive_size = false;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
354 return;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
355 }
3976
d912b598c6c3 7091032: G1: assert failure when NewRatio is used
tonyp
parents: 3927
diff changeset
356 }
1285
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
357
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
358 if (NewSize > MaxNewSize) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
359 if (FLAG_IS_CMDLINE(MaxNewSize)) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
360 warning("NewSize (" SIZE_FORMAT "k) is greater than the MaxNewSize (" SIZE_FORMAT "k). "
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
361 "A new max generation size of " SIZE_FORMAT "k will be used.",
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
362 NewSize/K, MaxNewSize/K, NewSize/K);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
363 }
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
364 MaxNewSize = NewSize;
12894
24f32d09a0d7 8023643: G1 assert failed when NewSize was specified greater than MaxNewSize
jwilhelm
parents: 12830
diff changeset
365 }
24f32d09a0d7 8023643: G1 assert failed when NewSize was specified greater than MaxNewSize
jwilhelm
parents: 12830
diff changeset
366
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
367 if (FLAG_IS_CMDLINE(NewSize)) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
368 _min_desired_young_length = MAX2((uint) (NewSize / HeapRegion::GrainBytes),
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
369 1U);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
370 if (FLAG_IS_CMDLINE(MaxNewSize)) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
371 _max_desired_young_length =
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
372 MAX2((uint) (MaxNewSize / HeapRegion::GrainBytes),
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
373 1U);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
374 _sizer_kind = SizerMaxAndNewSize;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
375 _adaptive_size = _min_desired_young_length == _max_desired_young_length;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
376 } else {
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
377 _sizer_kind = SizerNewSizeOnly;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
378 }
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
379 } else if (FLAG_IS_CMDLINE(MaxNewSize)) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
380 _max_desired_young_length =
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
381 MAX2((uint) (MaxNewSize / HeapRegion::GrainBytes),
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
382 1U);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
383 _sizer_kind = SizerMaxNewSizeOnly;
1285
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
384 }
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
385 }
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
386
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
387 uint G1YoungGenSizer::calculate_default_min_length(uint new_number_of_heap_regions) {
7449
37f7535e5f18 8001424: G1: Rename certain G1-specific flags
johnc
parents: 6628
diff changeset
388 uint default_value = (new_number_of_heap_regions * G1NewSizePercent) / 100;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
389 return MAX2(1U, default_value);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
390 }
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
391
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
392 uint G1YoungGenSizer::calculate_default_max_length(uint new_number_of_heap_regions) {
7449
37f7535e5f18 8001424: G1: Rename certain G1-specific flags
johnc
parents: 6628
diff changeset
393 uint default_value = (new_number_of_heap_regions * G1MaxNewSizePercent) / 100;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
394 return MAX2(1U, default_value);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
395 }
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
396
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
397 void G1YoungGenSizer::recalculate_min_max_young_length(uint number_of_heap_regions, uint* min_young_length, uint* max_young_length) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
398 assert(number_of_heap_regions > 0, "Heap must be initialized");
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
399
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
400 switch (_sizer_kind) {
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
401 case SizerDefaults:
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
402 *min_young_length = calculate_default_min_length(number_of_heap_regions);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
403 *max_young_length = calculate_default_max_length(number_of_heap_regions);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
404 break;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
405 case SizerNewSizeOnly:
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
406 *max_young_length = calculate_default_max_length(number_of_heap_regions);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
407 *max_young_length = MAX2(*min_young_length, *max_young_length);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
408 break;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
409 case SizerMaxNewSizeOnly:
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
410 *min_young_length = calculate_default_min_length(number_of_heap_regions);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
411 *min_young_length = MIN2(*min_young_length, *max_young_length);
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
412 break;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
413 case SizerMaxAndNewSize:
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
414 // Do nothing. Values set on the command line, don't update them at runtime.
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
415 break;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
416 case SizerNewRatio:
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
417 *min_young_length = number_of_heap_regions / (NewRatio + 1);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
418 *max_young_length = *min_young_length;
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
419 break;
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
420 default:
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
421 ShouldNotReachHere();
1285
a1c410de27e4 6928065: G1: use existing command line parameters to set the young generation size
tonyp
parents: 1283
diff changeset
422 }
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
423
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
424 assert(*min_young_length <= *max_young_length, "Invalid min/max young gen size values");
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
425 }
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
426
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
427 uint G1YoungGenSizer::max_young_length(uint number_of_heap_regions) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
428 // We need to pass the desired values because recalculation may not update these
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
429 // values in some cases.
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
430 uint temp = _min_desired_young_length;
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
431 uint result = _max_desired_young_length;
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
432 recalculate_min_max_young_length(number_of_heap_regions, &temp, &result);
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
433 return result;
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
434 }
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
435
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
436 void G1YoungGenSizer::heap_size_changed(uint new_number_of_heap_regions) {
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
437 recalculate_min_max_young_length(new_number_of_heap_regions, &_min_desired_young_length,
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 13057
diff changeset
438 &_max_desired_young_length);
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
439 }
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
440
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
441 void G1CollectorPolicy::init() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
442 // Set aside an initial future to_space.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
443 _g1 = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
444
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
445 assert(Heap_lock->owned_by_self(), "Locking discipline.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
446
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
447 initialize_gc_policy_counters();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
448
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
449 if (adaptive_young_list_length()) {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
450 _young_list_fixed_length = 0;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
451 } else {
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
452 _young_list_fixed_length = _young_gen_sizer->min_desired_young_length();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
453 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
454 _free_regions_at_end_of_collection = _g1->free_regions();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
455 update_young_list_target_length();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
456
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
457 // We may immediately start allocating regions and placing them on the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
458 // collection set list. Initialize the per-collection set info
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
459 start_incremental_cset_building();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
460 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
461
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
462 // Create the jstat counters for the policy.
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
463 void G1CollectorPolicy::initialize_gc_policy_counters() {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
464 _gc_policy_counters = new GCPolicyCounters("GarbageFirst", 1, 3);
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
465 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
466
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
467 bool G1CollectorPolicy::predict_will_fit(uint young_length,
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
468 double base_time_ms,
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
469 uint base_free_regions,
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
470 double target_pause_time_ms) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
471 if (young_length >= base_free_regions) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472 // end condition 1: not enough space for the young regions
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473 return false;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
474 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
475
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
476 double accum_surv_rate = accum_yg_surv_rate_pred((int) young_length - 1);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
477 size_t bytes_to_copy =
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
478 (size_t) (accum_surv_rate * (double) HeapRegion::GrainBytes);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479 double copy_time_ms = predict_object_copy_time_ms(bytes_to_copy);
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
480 double young_other_time_ms = predict_young_other_time_ms(young_length);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
481 double pause_time_ms = base_time_ms + copy_time_ms + young_other_time_ms;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
482 if (pause_time_ms > target_pause_time_ms) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
483 // end condition 2: prediction is over the target pause time
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 return false;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
485 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
486
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
487 size_t free_bytes =
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
488 (base_free_regions - young_length) * HeapRegion::GrainBytes;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
489 if ((2.0 * sigma()) * (double) bytes_to_copy > (double) free_bytes) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
490 // end condition 3: out-of-space (conservatively!)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
491 return false;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
492 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
493
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
494 // success!
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
498 void G1CollectorPolicy::record_new_heap_size(uint new_number_of_regions) {
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
499 // re-calculate the necessary reserve
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
500 double reserve_regions_d = (double) new_number_of_regions * _reserve_factor;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
501 // We use ceiling so that if reserve_regions_d is > 0.0 (but
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
502 // smaller than 1.0) we'll get 1.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
503 _reserve_regions = (uint) ceil(reserve_regions_d);
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
504
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
505 _young_gen_sizer->heap_size_changed(new_number_of_regions);
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
506 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
507
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
508 uint G1CollectorPolicy::calculate_young_list_desired_min_length(
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
509 uint base_min_length) {
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
510 uint desired_min_length = 0;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
511 if (adaptive_young_list_length()) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
512 if (_alloc_rate_ms_seq->num() > 3) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
513 double now_sec = os::elapsedTime();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
514 double when_ms = _mmu_tracker->when_max_gc_sec(now_sec) * 1000.0;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
515 double alloc_rate_ms = predict_alloc_rate_ms();
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
516 desired_min_length = (uint) ceil(alloc_rate_ms * when_ms);
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
517 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
518 // otherwise we don't have enough info to make the prediction
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
519 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
520 }
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
521 desired_min_length += base_min_length;
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
522 // make sure we don't go below any user-defined minimum bound
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
523 return MAX2(_young_gen_sizer->min_desired_young_length(), desired_min_length);
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
524 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
525
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
526 uint G1CollectorPolicy::calculate_young_list_desired_max_length() {
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
527 // Here, we might want to also take into account any additional
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
528 // constraints (i.e., user-defined minimum bound). Currently, we
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
529 // effectively don't set this bound.
4729
1cbe7978b021 7113021: G1: automatically enable young gen size auto-tuning when -Xms==-Xmx
brutisso
parents: 4728
diff changeset
530 return _young_gen_sizer->max_desired_young_length();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
531 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
532
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
533 void G1CollectorPolicy::update_young_list_target_length(size_t rs_lengths) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
534 if (rs_lengths == (size_t) -1) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
535 // if it's set to the default value (-1), we should predict it;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
536 // otherwise, use the given value.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
537 rs_lengths = (size_t) get_new_prediction(_rs_lengths_seq);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
538 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
539
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
540 // Calculate the absolute and desired min bounds.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
541
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
542 // This is how many young regions we already have (currently: the survivors).
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
543 uint base_min_length = recorded_survivor_regions();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
544 // This is the absolute minimum young length, which ensures that we
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
545 // can allocate one eden region in the worst-case.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
546 uint absolute_min_length = base_min_length + 1;
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
547 uint desired_min_length =
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
548 calculate_young_list_desired_min_length(base_min_length);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
549 if (desired_min_length < absolute_min_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
550 desired_min_length = absolute_min_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
551 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
552
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
553 // Calculate the absolute and desired max bounds.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
554
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
555 // We will try our best not to "eat" into the reserve.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
556 uint absolute_max_length = 0;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
557 if (_free_regions_at_end_of_collection > _reserve_regions) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
558 absolute_max_length = _free_regions_at_end_of_collection - _reserve_regions;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
559 }
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
560 uint desired_max_length = calculate_young_list_desired_max_length();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
561 if (desired_max_length > absolute_max_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
562 desired_max_length = absolute_max_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
563 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
564
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
565 uint young_list_target_length = 0;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
566 if (adaptive_young_list_length()) {
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
567 if (gcs_are_young()) {
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
568 young_list_target_length =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
569 calculate_young_list_target_length(rs_lengths,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
570 base_min_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
571 desired_min_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
572 desired_max_length);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
573 _rs_lengths_prediction = rs_lengths;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
574 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
575 // Don't calculate anything and let the code below bound it to
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
576 // the desired_min_length, i.e., do the next GC as soon as
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
577 // possible to maximize how many old regions we can add to it.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
578 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
579 } else {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
580 // The user asked for a fixed young gen so we'll fix the young gen
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
581 // whether the next GC is young or mixed.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
582 young_list_target_length = _young_list_fixed_length;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
583 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
584
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
585 // Make sure we don't go over the desired max length, nor under the
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
586 // desired min length. In case they clash, desired_min_length wins
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
587 // which is why that test is second.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
588 if (young_list_target_length > desired_max_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
589 young_list_target_length = desired_max_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
590 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
591 if (young_list_target_length < desired_min_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
592 young_list_target_length = desired_min_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
593 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
594
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
595 assert(young_list_target_length > recorded_survivor_regions(),
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
596 "we should be able to allocate at least one eden region");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
597 assert(young_list_target_length >= absolute_min_length, "post-condition");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
598 _young_list_target_length = young_list_target_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
599
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
600 update_max_gc_locker_expansion();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
601 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
602
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
603 uint
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
604 G1CollectorPolicy::calculate_young_list_target_length(size_t rs_lengths,
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
605 uint base_min_length,
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
606 uint desired_min_length,
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
607 uint desired_max_length) {
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
608 assert(adaptive_young_list_length(), "pre-condition");
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
609 assert(gcs_are_young(), "only call this for young GCs");
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
610
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
611 // In case some edge-condition makes the desired max length too small...
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
612 if (desired_max_length <= desired_min_length) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
613 return desired_min_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
614 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
615
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
616 // We'll adjust min_young_length and max_young_length not to include
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
617 // the already allocated young regions (i.e., so they reflect the
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
618 // min and max eden regions we'll allocate). The base_min_length
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
619 // will be reflected in the predictions by the
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
620 // survivor_regions_evac_time prediction.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
621 assert(desired_min_length > base_min_length, "invariant");
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
622 uint min_young_length = desired_min_length - base_min_length;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
623 assert(desired_max_length > base_min_length, "invariant");
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
624 uint max_young_length = desired_max_length - base_min_length;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
625
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
626 double target_pause_time_ms = _mmu_tracker->max_gc_time() * 1000.0;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
627 double survivor_regions_evac_time = predict_survivor_regions_evac_time();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
628 size_t pending_cards = (size_t) get_new_prediction(_pending_cards_seq);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
629 size_t adj_rs_lengths = rs_lengths + predict_rs_length_diff();
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
630 size_t scanned_cards = predict_young_card_num(adj_rs_lengths);
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
631 double base_time_ms =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
632 predict_base_elapsed_time_ms(pending_cards, scanned_cards) +
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
633 survivor_regions_evac_time;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
634 uint available_free_regions = _free_regions_at_end_of_collection;
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
635 uint base_free_regions = 0;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
636 if (available_free_regions > _reserve_regions) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
637 base_free_regions = available_free_regions - _reserve_regions;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
638 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
639
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
640 // Here, we will make sure that the shortest young length that
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
641 // makes sense fits within the target pause time.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
642
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
643 if (predict_will_fit(min_young_length, base_time_ms,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
644 base_free_regions, target_pause_time_ms)) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
645 // The shortest young length will fit into the target pause time;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
646 // we'll now check whether the absolute maximum number of young
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
647 // regions will fit in the target pause time. If not, we'll do
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
648 // a binary search between min_young_length and max_young_length.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
649 if (predict_will_fit(max_young_length, base_time_ms,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
650 base_free_regions, target_pause_time_ms)) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
651 // The maximum young length will fit into the target pause time.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
652 // We are done so set min young length to the maximum length (as
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
653 // the result is assumed to be returned in min_young_length).
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
654 min_young_length = max_young_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
655 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
656 // The maximum possible number of young regions will not fit within
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
657 // the target pause time so we'll search for the optimal
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
658 // length. The loop invariants are:
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
659 //
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
660 // min_young_length < max_young_length
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
661 // min_young_length is known to fit into the target pause time
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
662 // max_young_length is known not to fit into the target pause time
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
663 //
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
664 // Going into the loop we know the above hold as we've just
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
665 // checked them. Every time around the loop we check whether
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
666 // the middle value between min_young_length and
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
667 // max_young_length fits into the target pause time. If it
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
668 // does, it becomes the new min. If it doesn't, it becomes
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
669 // the new max. This way we maintain the loop invariants.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
670
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
671 assert(min_young_length < max_young_length, "invariant");
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
672 uint diff = (max_young_length - min_young_length) / 2;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
673 while (diff > 0) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
674 uint young_length = min_young_length + diff;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
675 if (predict_will_fit(young_length, base_time_ms,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
676 base_free_regions, target_pause_time_ms)) {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
677 min_young_length = young_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
678 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
679 max_young_length = young_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
680 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
681 assert(min_young_length < max_young_length, "invariant");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
682 diff = (max_young_length - min_young_length) / 2;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
683 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
684 // The results is min_young_length which, according to the
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
685 // loop invariants, should fit within the target pause time.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
686
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
687 // These are the post-conditions of the binary search above:
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
688 assert(min_young_length < max_young_length,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
689 "otherwise we should have discovered that max_young_length "
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
690 "fits into the pause target and not done the binary search");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
691 assert(predict_will_fit(min_young_length, base_time_ms,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
692 base_free_regions, target_pause_time_ms),
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
693 "min_young_length, the result of the binary search, should "
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
694 "fit into the pause target");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
695 assert(!predict_will_fit(min_young_length + 1, base_time_ms,
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
696 base_free_regions, target_pause_time_ms),
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
697 "min_young_length, the result of the binary search, should be "
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
698 "optimal, so no larger length should fit into the pause target");
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
699 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
700 } else {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
701 // Even the minimum length doesn't fit into the pause time
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
702 // target, return it as the result nevertheless.
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
703 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
704 return base_min_length + min_young_length;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
705 }
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
706
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
707 double G1CollectorPolicy::predict_survivor_regions_evac_time() {
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
708 double survivor_regions_evac_time = 0.0;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
709 for (HeapRegion * r = _recorded_survivor_head;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
710 r != NULL && r != _recorded_survivor_tail->get_next_young_region();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
711 r = r->get_next_young_region()) {
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
712 survivor_regions_evac_time += predict_region_elapsed_time_ms(r, gcs_are_young());
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
713 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
714 return survivor_regions_evac_time;
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
715 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
716
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
717 void G1CollectorPolicy::revise_young_list_target_length_if_necessary() {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
718 guarantee( adaptive_young_list_length(), "should not call this otherwise" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
719
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
720 size_t rs_lengths = _g1->young_list()->sampled_rs_lengths();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
721 if (rs_lengths > _rs_lengths_prediction) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
722 // add 10% to avoid having to recalculate often
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
723 size_t rs_lengths_prediction = rs_lengths * 1100 / 1000;
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
724 update_young_list_target_length(rs_lengths_prediction);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
725 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
726 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
727
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
728
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
729
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
730 HeapWord* G1CollectorPolicy::mem_allocate_work(size_t size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
731 bool is_tlab,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
732 bool* gc_overhead_limit_was_exceeded) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
733 guarantee(false, "Not using this policy feature yet.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
734 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
735 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
736
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
737 // This method controls how a collector handles one or more
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
738 // of its generations being fully allocated.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739 HeapWord* G1CollectorPolicy::satisfy_failed_allocation(size_t size,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
740 bool is_tlab) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
741 guarantee(false, "Not using this policy feature yet.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
742 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
743 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
744
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
745
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
746 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
747 bool G1CollectorPolicy::verify_young_ages() {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
748 HeapRegion* head = _g1->young_list()->first_region();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
749 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
750 verify_young_ages(head, _short_lived_surv_rate_group);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
751 // also call verify_young_ages on any additional surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
752 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
753
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
754 bool
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
755 G1CollectorPolicy::verify_young_ages(HeapRegion* head,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
756 SurvRateGroup *surv_rate_group) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
757 guarantee( surv_rate_group != NULL, "pre-condition" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
758
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
759 const char* name = surv_rate_group->name();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
760 bool ret = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
761 int prev_age = -1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
762
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
763 for (HeapRegion* curr = head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
764 curr != NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
765 curr = curr->get_next_young_region()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
766 SurvRateGroup* group = curr->surv_rate_group();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
767 if (group == NULL && !curr->is_survivor()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
768 gclog_or_tty->print_cr("## %s: encountered NULL surv_rate_group", name);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
769 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
770 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
771
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
772 if (surv_rate_group == group) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
773 int age = curr->age_in_surv_rate_group();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
774
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
775 if (age < 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
776 gclog_or_tty->print_cr("## %s: encountered negative age", name);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
777 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
778 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
779
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
780 if (age <= prev_age) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
781 gclog_or_tty->print_cr("## %s: region ages are not strictly increasing "
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
782 "(%d, %d)", name, age, prev_age);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
783 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
784 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
785 prev_age = age;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
786 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
787 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
788
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
789 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
790 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
791 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
792
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
793 void G1CollectorPolicy::record_full_collection_start() {
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
794 _full_collection_start_sec = os::elapsedTime();
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
795 record_heap_size_info_at_start(true /* full */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
796 // Release the future to-space so that it is available for compaction into.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
797 _g1->set_full_collection();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
798 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
799
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
800 void G1CollectorPolicy::record_full_collection_end() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
801 // Consider this like a collection pause for the purposes of allocation
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
802 // since last pause.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
803 double end_sec = os::elapsedTime();
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
804 double full_gc_time_sec = end_sec - _full_collection_start_sec;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
805 double full_gc_time_ms = full_gc_time_sec * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
806
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
807 _trace_gen1_time_data.record_full_collection(full_gc_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
808
595
3698e8f47799 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 547
diff changeset
809 update_recent_gc_times(end_sec, full_gc_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
810
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
811 _g1->clear_full_collection();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
812
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
813 // "Nuke" the heuristics that control the young/mixed GC
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
814 // transitions and make sure we start with young GCs after the Full GC.
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
815 set_gcs_are_young(true);
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
816 _last_young_gc = false;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
817 clear_initiate_conc_mark_if_possible();
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
818 clear_during_initial_mark_pause();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
819 _in_marking_window = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
820 _in_marking_window_im = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
821
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
822 _short_lived_surv_rate_group->start_adding_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
823 // also call this on any additional surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
825 record_survivor_regions(0, NULL, NULL);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
826
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
827 _free_regions_at_end_of_collection = _g1->free_regions();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
828 // Reset survivors SurvRateGroup.
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
829 _survivor_surv_rate_group->reset();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
830 update_young_list_target_length();
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
831 _collectionSetChooser->clear();
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
832 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
833
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
834 void G1CollectorPolicy::record_stop_world_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
835 _stop_world_start = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
836 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
837
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
838 void G1CollectorPolicy::record_collection_pause_start(double start_time_sec) {
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4834
diff changeset
839 // We only need to do this here as the policy will only be applied
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4834
diff changeset
840 // to the GC we're about to start. so, no point is calculating this
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4834
diff changeset
841 // every time we calculate / recalculate the target young length.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4834
diff changeset
842 update_survivors_policy();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
843
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
844 assert(_g1->used() == _g1->recalculate_used(),
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
845 err_msg("sanity, used: "SIZE_FORMAT" recalculate_used: "SIZE_FORMAT,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
846 _g1->used(), _g1->recalculate_used()));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
847
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
848 double s_w_t_ms = (start_time_sec - _stop_world_start) * 1000.0;
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
849 _trace_gen0_time_data.record_start_collection(s_w_t_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
850 _stop_world_start = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
851
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
852 record_heap_size_info_at_start(false /* full */);
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
853
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
854 phase_times()->record_cur_collection_start_sec(start_time_sec);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
855 _pending_cards = _g1->pending_card_num();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
856
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
857 _collection_set_bytes_used_before = 0;
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3823
diff changeset
858 _bytes_copied_during_gc = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
859
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
860 _last_gc_was_young = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
861
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
862 // do that for any other surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
863 _short_lived_surv_rate_group->stop_adding_regions();
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1261
diff changeset
864 _survivors_age_table.clear();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
865
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
866 assert( verify_young_ages(), "region age verification" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
867 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
868
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
869 void G1CollectorPolicy::record_concurrent_mark_init_end(double
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
870 mark_init_elapsed_time_ms) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
871 _during_marking = true;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
872 assert(!initiate_conc_mark_if_possible(), "we should have cleared it by now");
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
873 clear_during_initial_mark_pause();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
874 _cur_mark_stop_world_time_ms = mark_init_elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
875 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
876
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
877 void G1CollectorPolicy::record_concurrent_mark_remark_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
878 _mark_remark_start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
879 _during_marking = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
880 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
881
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
882 void G1CollectorPolicy::record_concurrent_mark_remark_end() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
883 double end_time_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
884 double elapsed_time_ms = (end_time_sec - _mark_remark_start_sec)*1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
885 _concurrent_mark_remark_times_ms->add(elapsed_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
886 _cur_mark_stop_world_time_ms += elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
887 _prev_collection_pause_end_ms += elapsed_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
888
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
889 _mmu_tracker->add_pause(_mark_remark_start_sec, end_time_sec, true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
890 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
891
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
892 void G1CollectorPolicy::record_concurrent_mark_cleanup_start() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
893 _mark_cleanup_start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
894 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
895
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
896 void G1CollectorPolicy::record_concurrent_mark_cleanup_completed() {
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
897 _last_young_gc = true;
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
898 _in_marking_window = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
899 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
900
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
901 void G1CollectorPolicy::record_concurrent_pause() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
902 if (_stop_world_start > 0.0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
903 double yield_ms = (os::elapsedTime() - _stop_world_start) * 1000.0;
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
904 _trace_gen0_time_data.record_yield_time(yield_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
905 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
906 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
907
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
908 bool G1CollectorPolicy::need_to_start_conc_mark(const char* source, size_t alloc_word_size) {
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
909 if (_g1->concurrent_mark()->cmThread()->during_cycle()) {
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
910 return false;
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
911 }
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
912
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
913 size_t marking_initiating_used_threshold =
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
914 (_g1->capacity() / 100) * InitiatingHeapOccupancyPercent;
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
915 size_t cur_used_bytes = _g1->non_young_capacity_bytes();
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
916 size_t alloc_byte_size = alloc_word_size * HeapWordSize;
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
917
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
918 if ((cur_used_bytes + alloc_byte_size) > marking_initiating_used_threshold) {
11125
f4311079200c 8020155: PSR:PERF G1 not collecting old regions when humongous allocations interfer
brutisso
parents: 10405
diff changeset
919 if (gcs_are_young() && !_last_young_gc) {
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
920 ergo_verbose5(ErgoConcCycles,
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
921 "request concurrent cycle initiation",
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
922 ergo_format_reason("occupancy higher than threshold")
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
923 ergo_format_byte("occupancy")
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
924 ergo_format_byte("allocation request")
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
925 ergo_format_byte_perc("threshold")
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
926 ergo_format_str("source"),
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
927 cur_used_bytes,
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
928 alloc_byte_size,
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
929 marking_initiating_used_threshold,
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
930 (double) InitiatingHeapOccupancyPercent,
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
931 source);
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
932 return true;
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
933 } else {
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
934 ergo_verbose5(ErgoConcCycles,
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
935 "do not request concurrent cycle initiation",
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
936 ergo_format_reason("still doing mixed collections")
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
937 ergo_format_byte("occupancy")
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
938 ergo_format_byte("allocation request")
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
939 ergo_format_byte_perc("threshold")
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
940 ergo_format_str("source"),
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
941 cur_used_bytes,
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4829
diff changeset
942 alloc_byte_size,
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
943 marking_initiating_used_threshold,
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
944 (double) InitiatingHeapOccupancyPercent,
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
945 source);
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
946 }
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
947 }
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
948
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
949 return false;
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
950 }
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
951
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
952 // Anything below that is considered to be zero
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
953 #define MIN_TIMER_GRANULARITY 0.0000001
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
954
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10291
diff changeset
955 void G1CollectorPolicy::record_collection_pause_end(double pause_time_ms, EvacuationInfo& evacuation_info) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
956 double end_time_sec = os::elapsedTime();
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
957 assert(_cur_collection_pause_used_regions_at_start >= cset_region_length(),
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
958 "otherwise, the subtraction below does not make sense");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
959 size_t rs_size =
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
960 _cur_collection_pause_used_regions_at_start - cset_region_length();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
961 size_t cur_used_bytes = _g1->used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
962 assert(cur_used_bytes == _g1->recalculate_used(), "It should!");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
963 bool last_pause_included_initial_mark = false;
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
964 bool update_stats = !_g1->evacuation_failed();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
965
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
966 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
967 if (G1YoungSurvRateVerbose) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
968 gclog_or_tty->print_cr("");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
969 _short_lived_surv_rate_group->print();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
970 // do that for any other surv rate groups too
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
971 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
972 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
973
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
974 last_pause_included_initial_mark = during_initial_mark_pause();
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
975 if (last_pause_included_initial_mark) {
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
976 record_concurrent_mark_init_end(0.0);
11125
f4311079200c 8020155: PSR:PERF G1 not collecting old regions when humongous allocations interfer
brutisso
parents: 10405
diff changeset
977 } else if (need_to_start_conc_mark("end of GC")) {
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
978 // Note: this might have already been set, if during the last
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
979 // pause we decided to start a cycle but at the beginning of
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
980 // this pause we decided to postpone it. That's OK.
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
981 set_initiate_conc_mark_if_possible();
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
982 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
983
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
984 _mmu_tracker->add_pause(end_time_sec - pause_time_ms/1000.0,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
985 end_time_sec, false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
986
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10291
diff changeset
987 evacuation_info.set_collectionset_used_before(_collection_set_bytes_used_before);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10291
diff changeset
988 evacuation_info.set_bytes_copied(_bytes_copied_during_gc);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10291
diff changeset
989
595
3698e8f47799 6804746: G1: guarantee(variance() > -1.0,"variance should be >= 0") (due to evacuation failure)
tonyp
parents: 547
diff changeset
990 if (update_stats) {
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
991 _trace_gen0_time_data.record_end_collection(pause_time_ms, phase_times());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
992 // this is where we update the allocation rate of the application
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
993 double app_time_ms =
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
994 (phase_times()->cur_collection_start_sec() * 1000.0 - _prev_collection_pause_end_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
995 if (app_time_ms < MIN_TIMER_GRANULARITY) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
996 // This usually happens due to the timer not having the required
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
997 // granularity. Some Linuxes are the usual culprits.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
998 // We'll just set it to something (arbitrarily) small.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
999 app_time_ms = 1.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1000 }
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1001 // We maintain the invariant that all objects allocated by mutator
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1002 // threads will be allocated out of eden regions. So, we can use
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1003 // the eden region number allocated since the previous GC to
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1004 // calculate the application's allocate rate. The only exception
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1005 // to that is humongous objects that are allocated separately. But
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1006 // given that humongous object allocations do not really affect
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1007 // either the pause's duration nor when the next pause will take
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1008 // place we can safely ignore them here.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1009 uint regions_allocated = eden_cset_region_length();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1010 double alloc_rate_ms = (double) regions_allocated / app_time_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1011 _alloc_rate_ms_seq->add(alloc_rate_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1012
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1013 double interval_ms =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1014 (end_time_sec - _recent_prev_end_times_for_all_gcs_sec->oldest()) * 1000.0;
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
1015 update_recent_gc_times(end_time_sec, pause_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1016 _recent_avg_pause_time_ratio = _recent_gc_times_ms->sum()/interval_ms;
1086
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1017 if (recent_avg_pause_time_ratio() < 0.0 ||
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1018 (recent_avg_pause_time_ratio() - 1.0 > 0.0)) {
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1019 #ifndef PRODUCT
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1020 // Dump info to allow post-facto debugging
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1021 gclog_or_tty->print_cr("recent_avg_pause_time_ratio() out of bounds");
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1022 gclog_or_tty->print_cr("-------------------------------------------");
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1023 gclog_or_tty->print_cr("Recent GC Times (ms):");
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1024 _recent_gc_times_ms->dump();
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1025 gclog_or_tty->print_cr("(End Time=%3.3f) Recent GC End Times (s):", end_time_sec);
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1026 _recent_prev_end_times_for_all_gcs_sec->dump();
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1027 gclog_or_tty->print_cr("GC = %3.3f, Interval = %3.3f, Ratio = %3.3f",
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1028 _recent_gc_times_ms->sum(), interval_ms, recent_avg_pause_time_ratio());
1087
23b9a8d315fc 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 1086
diff changeset
1029 // In debug mode, terminate the JVM if the user wants to debug at this point.
23b9a8d315fc 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 1086
diff changeset
1030 assert(!G1FailOnFPError, "Debugging data for CR 6898948 has been dumped above");
23b9a8d315fc 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 1086
diff changeset
1031 #endif // !PRODUCT
23b9a8d315fc 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 1086
diff changeset
1032 // Clip ratio between 0.0 and 1.0, and continue. This will be fixed in
23b9a8d315fc 6902701: G1: protect debugging code related to 6898948 with a debug flag
ysr
parents: 1086
diff changeset
1033 // CR 6902692 by redoing the manner in which the ratio is incrementally computed.
1086
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1034 if (_recent_avg_pause_time_ratio < 0.0) {
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1035 _recent_avg_pause_time_ratio = 0.0;
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1036 } else {
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1037 assert(_recent_avg_pause_time_ratio - 1.0 > 0.0, "Ctl-point invariant");
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1038 _recent_avg_pause_time_ratio = 1.0;
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1039 }
89f1b9ae8991 6898948: G1: forensic instrumentation for out-of-bounds recent_avg_pause_time_ratio()
ysr
parents: 1043
diff changeset
1040 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1041 }
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1042
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1043 bool new_in_marking_window = _in_marking_window;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1044 bool new_in_marking_window_im = false;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1045 if (during_initial_mark_pause()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1046 new_in_marking_window = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1047 new_in_marking_window_im = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1048 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1049
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1050 if (_last_young_gc) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1051 // This is supposed to to be the "last young GC" before we start
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1052 // doing mixed GCs. Here we decide whether to start mixed GCs or not.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1053
3982
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1054 if (!last_pause_included_initial_mark) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1055 if (next_gc_should_be_mixed("start mixed GCs",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1056 "do not start mixed GCs")) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1057 set_gcs_are_young(false);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1058 }
3982
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1059 } else {
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1060 ergo_verbose0(ErgoMixedGCs,
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1061 "do not start mixed GCs",
3982
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1062 ergo_format_reason("concurrent cycle is about to start"));
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1063 }
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1064 _last_young_gc = false;
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1065 }
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1066
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1067 if (!_last_gc_was_young) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1068 // This is a mixed GC. Here we decide whether to continue doing
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1069 // mixed GCs or not.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1070
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1071 if (!next_gc_should_be_mixed("continue mixed GCs",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1072 "do not continue mixed GCs")) {
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1073 set_gcs_are_young(true);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1074 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1075 }
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1076
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1077 _short_lived_surv_rate_group->start_adding_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1078 // do that for any other surv rate groupsx
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1079
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 648
diff changeset
1080 if (update_stats) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1081 double cost_per_card_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1082 if (_pending_cards > 0) {
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1083 cost_per_card_ms = phase_times()->average_last_update_rs_time() / (double) _pending_cards;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1084 _cost_per_card_ms_seq->add(cost_per_card_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1085 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1086
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1087 size_t cards_scanned = _g1->cards_scanned();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1088
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1089 double cost_per_entry_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1090 if (cards_scanned > 10) {
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1091 cost_per_entry_ms = phase_times()->average_last_scan_rs_time() / (double) cards_scanned;
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1092 if (_last_gc_was_young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1093 _cost_per_entry_ms_seq->add(cost_per_entry_ms);
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1094 } else {
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1095 _mixed_cost_per_entry_ms_seq->add(cost_per_entry_ms);
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1096 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1097 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1098
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1099 if (_max_rs_lengths > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1100 double cards_per_entry_ratio =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1101 (double) cards_scanned / (double) _max_rs_lengths;
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1102 if (_last_gc_was_young) {
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1103 _young_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1104 } else {
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1105 _mixed_cards_per_entry_ratio_seq->add(cards_per_entry_ratio);
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1106 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1107 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1108
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1109 // This is defensive. For a while _max_rs_lengths could get
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1110 // smaller than _recorded_rs_lengths which was causing
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1111 // rs_length_diff to get very large and mess up the RSet length
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1112 // predictions. The reason was unsafe concurrent updates to the
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1113 // _inc_cset_recorded_rs_lengths field which the code below guards
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1114 // against (see CR 7118202). This bug has now been fixed (see CR
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1115 // 7119027). However, I'm still worried that
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1116 // _inc_cset_recorded_rs_lengths might still end up somewhat
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1117 // inaccurate. The concurrent refinement thread calculates an
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1118 // RSet's length concurrently with other CR threads updating it
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1119 // which might cause it to calculate the length incorrectly (if,
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1120 // say, it's in mid-coarsening). So I'll leave in the defensive
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1121 // conditional below just in case.
4130
d23d2b18183e 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 4097
diff changeset
1122 size_t rs_length_diff = 0;
d23d2b18183e 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 4097
diff changeset
1123 if (_max_rs_lengths > _recorded_rs_lengths) {
d23d2b18183e 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 4097
diff changeset
1124 rs_length_diff = _max_rs_lengths - _recorded_rs_lengths;
d23d2b18183e 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 4097
diff changeset
1125 }
d23d2b18183e 7118202: G1: eden size unnecessarily drops to a minimum
tonyp
parents: 4097
diff changeset
1126 _rs_length_diff_seq->add((double) rs_length_diff);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1127
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1128 size_t freed_bytes = _heap_used_bytes_before_gc - cur_used_bytes;
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1129 size_t copied_bytes = _collection_set_bytes_used_before - freed_bytes;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1130 double cost_per_byte_ms = 0.0;
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1131
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1132 if (copied_bytes > 0) {
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1133 cost_per_byte_ms = phase_times()->average_last_obj_copy_time() / (double) copied_bytes;
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1134 if (_in_marking_window) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1135 _cost_per_byte_ms_during_cm_seq->add(cost_per_byte_ms);
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1136 } else {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1137 _cost_per_byte_ms_seq->add(cost_per_byte_ms);
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1138 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1139 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1140
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1141 double all_other_time_ms = pause_time_ms -
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1142 (phase_times()->average_last_update_rs_time() + phase_times()->average_last_scan_rs_time()
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1143 + phase_times()->average_last_obj_copy_time() + phase_times()->average_last_termination_time());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1144
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1145 double young_other_time_ms = 0.0;
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1146 if (young_cset_region_length() > 0) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1147 young_other_time_ms =
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1148 phase_times()->young_cset_choice_time_ms() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1149 phase_times()->young_free_cset_time_ms();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1150 _young_other_cost_per_region_ms_seq->add(young_other_time_ms /
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1151 (double) young_cset_region_length());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1152 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1153 double non_young_other_time_ms = 0.0;
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1154 if (old_cset_region_length() > 0) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1155 non_young_other_time_ms =
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1156 phase_times()->non_young_cset_choice_time_ms() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1157 phase_times()->non_young_free_cset_time_ms();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1158
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1159 _non_young_other_cost_per_region_ms_seq->add(non_young_other_time_ms /
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1160 (double) old_cset_region_length());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1161 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1162
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163 double constant_other_time_ms = all_other_time_ms -
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1164 (young_other_time_ms + non_young_other_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1165 _constant_other_time_ms_seq->add(constant_other_time_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1166
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1167 double survival_ratio = 0.0;
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1168 if (_collection_set_bytes_used_before > 0) {
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3823
diff changeset
1169 survival_ratio = (double) _bytes_copied_during_gc /
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1170 (double) _collection_set_bytes_used_before;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1171 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1172
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1173 _pending_cards_seq->add((double) _pending_cards);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1174 _rs_lengths_seq->add((double) _max_rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1175 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1176
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1177 _in_marking_window = new_in_marking_window;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1178 _in_marking_window_im = new_in_marking_window_im;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1179 _free_regions_at_end_of_collection = _g1->free_regions();
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1180 update_young_list_target_length();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1181
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1182 // Note that _mmu_tracker->max_gc_time() returns the time in seconds.
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1261
diff changeset
1183 double update_rs_time_goal_ms = _mmu_tracker->max_gc_time() * MILLIUNITS * G1RSetUpdatingPauseTimePercent / 100.0;
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1184 adjust_concurrent_refinement(phase_times()->average_last_update_rs_time(),
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1185 phase_times()->sum_last_update_rs_processed_buffers(), update_rs_time_goal_ms);
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1186
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1187 _collectionSetChooser->verify();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1188 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1189
6059
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 6030
diff changeset
1190 #define EXT_SIZE_FORMAT "%.1f%s"
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1191 #define EXT_SIZE_PARAMS(bytes) \
6059
3a22b77e755a 7161545: G1: Minor cleanups to the G1 logging
brutisso
parents: 6030
diff changeset
1192 byte_size_in_proper_unit((double)(bytes)), \
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1193 proper_unit_for_byte_size((bytes))
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1194
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1195 void G1CollectorPolicy::record_heap_size_info_at_start(bool full) {
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
1196 YoungList* young_list = _g1->young_list();
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1197 _eden_used_bytes_before_gc = young_list->eden_used_bytes();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1198 _survivor_used_bytes_before_gc = young_list->survivor_used_bytes();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1199 _heap_capacity_bytes_before_gc = _g1->capacity();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1200 _heap_used_bytes_before_gc = _g1->used();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
1201 _cur_collection_pause_used_regions_at_start = _g1->used_regions();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
1202
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1203 _eden_capacity_bytes_before_gc =
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1204 (_young_list_target_length * HeapRegion::GrainBytes) - _survivor_used_bytes_before_gc;
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
1205
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1206 if (full) {
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1207 _metaspace_used_bytes_before_gc = MetaspaceAux::allocated_used_bytes();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1208 }
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
1209 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8681
diff changeset
1210
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1211 void G1CollectorPolicy::print_heap_transition() {
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1212 _g1->print_size_transition(gclog_or_tty,
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1213 _heap_used_bytes_before_gc,
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1214 _g1->used(),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1215 _g1->capacity());
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1216 }
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
1217
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1218 void G1CollectorPolicy::print_detailed_heap_transition(bool full) {
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1219 YoungList* young_list = _g1->young_list();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1220
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1221 size_t eden_used_bytes_after_gc = young_list->eden_used_bytes();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1222 size_t survivor_used_bytes_after_gc = young_list->survivor_used_bytes();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1223 size_t heap_used_bytes_after_gc = _g1->used();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1224
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1225 size_t heap_capacity_bytes_after_gc = _g1->capacity();
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1226 size_t eden_capacity_bytes_after_gc =
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1227 (_young_list_target_length * HeapRegion::GrainBytes) - survivor_used_bytes_after_gc;
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1228
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1229 gclog_or_tty->print(
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1230 " [Eden: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT") "
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1231 "Survivors: "EXT_SIZE_FORMAT"->"EXT_SIZE_FORMAT" "
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1232 "Heap: "EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")->"
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1233 EXT_SIZE_FORMAT"("EXT_SIZE_FORMAT")]",
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1234 EXT_SIZE_PARAMS(_eden_used_bytes_before_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1235 EXT_SIZE_PARAMS(_eden_capacity_bytes_before_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1236 EXT_SIZE_PARAMS(eden_used_bytes_after_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1237 EXT_SIZE_PARAMS(eden_capacity_bytes_after_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1238 EXT_SIZE_PARAMS(_survivor_used_bytes_before_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1239 EXT_SIZE_PARAMS(survivor_used_bytes_after_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1240 EXT_SIZE_PARAMS(_heap_used_bytes_before_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1241 EXT_SIZE_PARAMS(_heap_capacity_bytes_before_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1242 EXT_SIZE_PARAMS(heap_used_bytes_after_gc),
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1243 EXT_SIZE_PARAMS(heap_capacity_bytes_after_gc));
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1244
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1245 if (full) {
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1246 MetaspaceAux::print_metaspace_change(_metaspace_used_bytes_before_gc);
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1247 }
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1248
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10239
diff changeset
1249 gclog_or_tty->cr();
3764
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1250 }
053d84a76d3d 7032531: G1: enhance GC logging to include more accurate eden / survivor size transitions
tonyp
parents: 2430
diff changeset
1251
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1252 void G1CollectorPolicy::adjust_concurrent_refinement(double update_rs_time,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1253 double update_rs_processed_buffers,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1254 double goal_ms) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1255 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1256 ConcurrentG1Refine *cg1r = G1CollectedHeap::heap()->concurrent_g1_refine();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1257
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1261
diff changeset
1258 if (G1UseAdaptiveConcRefinement) {
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1259 const int k_gy = 3, k_gr = 6;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1260 const double inc_k = 1.1, dec_k = 0.9;
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1261
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1262 int g = cg1r->green_zone();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1263 if (update_rs_time > goal_ms) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1264 g = (int)(g * dec_k); // Can become 0, that's OK. That would mean a mutator-only processing.
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1265 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1266 if (update_rs_time < goal_ms && update_rs_processed_buffers > g) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1267 g = (int)MAX2(g * inc_k, g + 1.0);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1268 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1269 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1270 // Change the refinement threads params
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1271 cg1r->set_green_zone(g);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1272 cg1r->set_yellow_zone(g * k_gy);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1273 cg1r->set_red_zone(g * k_gr);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1274 cg1r->reinitialize_threads();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1275
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1276 int processing_threshold_delta = MAX2((int)(cg1r->green_zone() * sigma()), 1);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1277 int processing_threshold = MIN2(cg1r->green_zone() + processing_threshold_delta,
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1278 cg1r->yellow_zone());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1279 // Change the barrier params
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1280 dcqs.set_process_completed_threshold(processing_threshold);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1281 dcqs.set_max_completed_queue(cg1r->red_zone());
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1282 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1283
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1284 int curr_queue_size = dcqs.completed_buffers_num();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1285 if (curr_queue_size >= cg1r->yellow_zone()) {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1286 dcqs.set_completed_queue_padding(curr_queue_size);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1287 } else {
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1288 dcqs.set_completed_queue_padding(0);
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1289 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1290 dcqs.notify_if_necessary();
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1291 }
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1088
diff changeset
1292
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1293 double
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1294 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1295 size_t scanned_cards) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1296 return
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1297 predict_rs_update_time_ms(pending_cards) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1298 predict_rs_scan_time_ms(scanned_cards) +
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1299 predict_constant_other_time_ms();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1300 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1301
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1302 double
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1303 G1CollectorPolicy::predict_base_elapsed_time_ms(size_t pending_cards) {
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1304 size_t rs_length = predict_rs_length_diff();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1305 size_t card_num;
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1306 if (gcs_are_young()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1307 card_num = predict_young_card_num(rs_length);
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1308 } else {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1309 card_num = predict_non_young_card_num(rs_length);
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1310 }
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1311 return predict_base_elapsed_time_ms(pending_cards, card_num);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1312 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1313
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1314 size_t G1CollectorPolicy::predict_bytes_to_copy(HeapRegion* hr) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1315 size_t bytes_to_copy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1316 if (hr->is_marked())
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1317 bytes_to_copy = hr->max_live_bytes();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1318 else {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1319 assert(hr->is_young() && hr->age_in_surv_rate_group() != -1, "invariant");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1320 int age = hr->age_in_surv_rate_group();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1321 double yg_surv_rate = predict_yg_surv_rate(age, hr->surv_rate_group());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1322 bytes_to_copy = (size_t) ((double) hr->used() * yg_surv_rate);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1323 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1324 return bytes_to_copy;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1325 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1326
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1327 double
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1328 G1CollectorPolicy::predict_region_elapsed_time_ms(HeapRegion* hr,
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1329 bool for_young_gc) {
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1330 size_t rs_length = hr->rem_set()->occupied();
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1331 size_t card_num;
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1332
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1333 // Predicting the number of cards is based on which type of GC
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1334 // we're predicting for.
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1335 if (for_young_gc) {
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1336 card_num = predict_young_card_num(rs_length);
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1337 } else {
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1338 card_num = predict_non_young_card_num(rs_length);
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1339 }
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1340 size_t bytes_to_copy = predict_bytes_to_copy(hr);
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1341
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1342 double region_elapsed_time_ms =
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1343 predict_rs_scan_time_ms(card_num) +
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1344 predict_object_copy_time_ms(bytes_to_copy);
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1345
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1346 // The prediction of the "other" time for this region is based
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1347 // upon the region type and NOT the GC type.
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1348 if (hr->is_young()) {
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1349 region_elapsed_time_ms += predict_young_other_time_ms(1);
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1350 } else {
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1351 region_elapsed_time_ms += predict_non_young_other_time_ms(1);
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1352 }
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1353 return region_elapsed_time_ms;
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1354 }
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1355
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1356 void
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1357 G1CollectorPolicy::init_cset_region_lengths(uint eden_cset_region_length,
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1358 uint survivor_cset_region_length) {
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1359 _eden_cset_region_length = eden_cset_region_length;
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1360 _survivor_cset_region_length = survivor_cset_region_length;
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1361 _old_cset_region_length = 0;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1362 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1363
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1364 void G1CollectorPolicy::set_recorded_rs_lengths(size_t rs_lengths) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1365 _recorded_rs_lengths = rs_lengths;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1366 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1367
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1368 void G1CollectorPolicy::update_recent_gc_times(double end_time_sec,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1369 double elapsed_ms) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1370 _recent_gc_times_ms->add(elapsed_ms);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1371 _recent_prev_end_times_for_all_gcs_sec->add(end_time_sec);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1372 _prev_collection_pause_end_ms = end_time_sec * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1373 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1374
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1375 size_t G1CollectorPolicy::expansion_amount() {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1376 double recent_gc_overhead = recent_avg_pause_time_ratio() * 100.0;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1377 double threshold = _gc_overhead_perc;
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1378 if (recent_gc_overhead > threshold) {
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1379 // We will double the existing space, or take
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1380 // G1ExpandByPercentOfAvailable % of the available expansion
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1381 // space, whichever is smaller, bounded below by a minimum
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1382 // expansion (unless that's all that's left.)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1383 const size_t min_expand_bytes = 1*M;
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2152
diff changeset
1384 size_t reserved_bytes = _g1->max_capacity();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1385 size_t committed_bytes = _g1->capacity();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1386 size_t uncommitted_bytes = reserved_bytes - committed_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1387 size_t expand_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1388 size_t expand_bytes_via_pct =
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 677
diff changeset
1389 uncommitted_bytes * G1ExpandByPercentOfAvailable / 100;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1390 expand_bytes = MIN2(expand_bytes_via_pct, committed_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1391 expand_bytes = MAX2(expand_bytes, min_expand_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1392 expand_bytes = MIN2(expand_bytes, uncommitted_bytes);
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1393
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1394 ergo_verbose5(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1395 "attempt heap expansion",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1396 ergo_format_reason("recent GC overhead higher than "
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1397 "threshold after GC")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1398 ergo_format_perc("recent GC overhead")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1399 ergo_format_perc("threshold")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1400 ergo_format_byte("uncommitted")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1401 ergo_format_byte_perc("calculated expansion amount"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1402 recent_gc_overhead, threshold,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1403 uncommitted_bytes,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1404 expand_bytes_via_pct, (double) G1ExpandByPercentOfAvailable);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1405
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1406 return expand_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1407 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1408 return 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1409 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1410 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1411
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1412 void G1CollectorPolicy::print_tracing_info() const {
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
1413 _trace_gen0_time_data.print();
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
1414 _trace_gen1_time_data.print();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1415 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1416
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1417 void G1CollectorPolicy::print_yg_surv_rate_info() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1418 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1419 _short_lived_surv_rate_group->print_surv_rate_summary();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1420 // add this call for any other surv rate groups
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1421 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1422 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1423
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1424 uint G1CollectorPolicy::max_regions(int purpose) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1425 switch (purpose) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1426 case GCAllocForSurvived:
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1427 return _max_survivor_regions;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1428 case GCAllocForTenured:
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1429 return REGIONS_UNLIMITED;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1430 default:
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1431 ShouldNotReachHere();
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1432 return REGIONS_UNLIMITED;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1433 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1434 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1435
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1436 void G1CollectorPolicy::update_max_gc_locker_expansion() {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1437 uint expansion_region_num = 0;
1991
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1438 if (GCLockerEdenExpansionPercent > 0) {
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1439 double perc = (double) GCLockerEdenExpansionPercent / 100.0;
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1440 double expansion_region_num_d = perc * (double) _young_list_target_length;
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1441 // We use ceiling so that if expansion_region_num_d is > 0.0 (but
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1442 // less than 1.0) we'll get 1.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1443 expansion_region_num = (uint) ceil(expansion_region_num_d);
1991
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1444 } else {
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1445 assert(expansion_region_num == 0, "sanity");
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1446 }
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1447 _young_list_max_length = _young_list_target_length + expansion_region_num;
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1448 assert(_young_list_target_length <= _young_list_max_length, "post-condition");
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1449 }
016a3628c885 6994056: G1: when GC locker is active, extend the Eden instead of allocating into the old gen
tonyp
parents: 1973
diff changeset
1450
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1451 // Calculates survivor space parameters.
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1452 void G1CollectorPolicy::update_survivors_policy() {
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1453 double max_survivor_regions_d =
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1454 (double) _young_list_target_length / (double) SurvivorRatio;
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1455 // We use ceiling so that if max_survivor_regions_d is > 0.0 (but
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1456 // smaller than 1.0) we'll get 1.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1457 _max_survivor_regions = (uint) ceil(max_survivor_regions_d);
3919
4f41766176cf 7084509: G1: fix inconsistencies and mistakes in the young list target length calculations
tonyp
parents: 3914
diff changeset
1458
3868
ae73da50be4b 7081064: G1: remove develop params G1FixedSurvivorSpaceSize, G1FixedTenuringThreshold, and G1FixedEdenSize
tonyp
parents: 3867
diff changeset
1459 _tenuring_threshold = _survivors_age_table.compute_tenuring_threshold(
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1460 HeapRegion::GrainWords * _max_survivor_regions);
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1461 }
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
1462
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1463 bool G1CollectorPolicy::force_initial_mark_if_outside_cycle(
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1464 GCCause::Cause gc_cause) {
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1465 bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1466 if (!during_cycle) {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1467 ergo_verbose1(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1468 "request concurrent cycle initiation",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1469 ergo_format_reason("requested by GC cause")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1470 ergo_format_str("GC cause"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1471 GCCause::to_string(gc_cause));
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1472 set_initiate_conc_mark_if_possible();
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1473 return true;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1474 } else {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1475 ergo_verbose1(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1476 "do not request concurrent cycle initiation",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1477 ergo_format_reason("concurrent cycle already in progress")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1478 ergo_format_str("GC cause"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1479 GCCause::to_string(gc_cause));
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1480 return false;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1481 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1482 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1483
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1484 void
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1485 G1CollectorPolicy::decide_on_conc_mark_initiation() {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1486 // We are about to decide on whether this pause will be an
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1487 // initial-mark pause.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1488
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1489 // First, during_initial_mark_pause() should not be already set. We
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1490 // will set it here if we have to. However, it should be cleared by
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1491 // the end of the pause (it's only set for the duration of an
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1492 // initial-mark pause).
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1493 assert(!during_initial_mark_pause(), "pre-condition");
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1494
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1495 if (initiate_conc_mark_if_possible()) {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1496 // We had noticed on a previous pause that the heap occupancy has
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1497 // gone over the initiating threshold and we should start a
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1498 // concurrent marking cycle. So we might initiate one.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1499
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1500 bool during_cycle = _g1->concurrent_mark()->cmThread()->during_cycle();
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1501 if (!during_cycle) {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1502 // The concurrent marking thread is not "during a cycle", i.e.,
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1503 // it has completed the last one. So we can go ahead and
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1504 // initiate a new cycle.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1505
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1506 set_during_initial_mark_pause();
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1507 // We do not allow mixed GCs during marking.
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1508 if (!gcs_are_young()) {
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1509 set_gcs_are_young(true);
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1510 ergo_verbose0(ErgoMixedGCs,
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1511 "end mixed GCs",
3982
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1512 ergo_format_reason("concurrent cycle is about to start"));
273b46400613 7086533: G1: assert(!_g1->is_obj_dead(obj)): We should not be preserving dead objs: g1CollectedHeap.cpp:3835
johnc
parents: 3979
diff changeset
1513 }
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1514
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1515 // And we can now clear initiate_conc_mark_if_possible() as
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1516 // we've already acted on it.
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1517 clear_initiate_conc_mark_if_possible();
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1518
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1519 ergo_verbose0(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1520 "initiate concurrent cycle",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1521 ergo_format_reason("concurrent cycle initiation requested"));
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1522 } else {
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1523 // The concurrent marking thread is still finishing up the
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1524 // previous cycle. If we start one right now the two cycles
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1525 // overlap. In particular, the concurrent marking thread might
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1526 // be in the process of clearing the next marking bitmap (which
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1527 // we will use for the next cycle if we start one). Starting a
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1528 // cycle now will be bad given that parts of the marking
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1529 // information might get cleared by the marking thread. And we
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1530 // cannot wait for the marking thread to finish the cycle as it
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1531 // periodically yields while clearing the next marking bitmap
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1532 // and, if it's in a yield point, it's waiting for us to
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1533 // finish. So, at this point we will not start a cycle and we'll
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1534 // let the concurrent marking thread complete the last one.
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1535 ergo_verbose0(ErgoConcCycles,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1536 "do not initiate concurrent cycle",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1537 ergo_format_reason("concurrent cycle already in progress"));
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1538 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1539 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1540 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1356
diff changeset
1541
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1542 class KnownGarbageClosure: public HeapRegionClosure {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1543 G1CollectedHeap* _g1h;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1544 CollectionSetChooser* _hrSorted;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1545
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1546 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1547 KnownGarbageClosure(CollectionSetChooser* hrSorted) :
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1548 _g1h(G1CollectedHeap::heap()), _hrSorted(hrSorted) { }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1549
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1550 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1551 // We only include humongous regions in collection
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1552 // sets when concurrent mark shows that their contained object is
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1553 // unreachable.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1554
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1555 // Do we have any marking information for this region?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1556 if (r->is_marked()) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1557 // We will skip any region that's currently used as an old GC
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1558 // alloc region (we should not consider those for collection
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1559 // before we fill them up).
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1560 if (_hrSorted->should_add(r) && !_g1h->is_old_gc_alloc_region(r)) {
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1561 _hrSorted->add_region(r);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1562 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1563 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1564 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1565 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1566 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1567
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1568 class ParKnownGarbageHRClosure: public HeapRegionClosure {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1569 G1CollectedHeap* _g1h;
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6219
diff changeset
1570 CSetChooserParUpdater _cset_updater;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1571
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1572 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1573 ParKnownGarbageHRClosure(CollectionSetChooser* hrSorted,
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1574 uint chunk_size) :
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6219
diff changeset
1575 _g1h(G1CollectedHeap::heap()),
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6219
diff changeset
1576 _cset_updater(hrSorted, true /* parallel */, chunk_size) { }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1577
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1578 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1579 // Do we have any marking information for this region?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1580 if (r->is_marked()) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1581 // We will skip any region that's currently used as an old GC
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1582 // alloc region (we should not consider those for collection
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1583 // before we fill them up).
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6219
diff changeset
1584 if (_cset_updater.should_add(r) && !_g1h->is_old_gc_alloc_region(r)) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6219
diff changeset
1585 _cset_updater.add_region(r);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1586 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1587 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1588 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1589 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1590 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1591
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1592 class ParKnownGarbageTask: public AbstractGangTask {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1593 CollectionSetChooser* _hrSorted;
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1594 uint _chunk_size;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1595 G1CollectedHeap* _g1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1596 public:
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1597 ParKnownGarbageTask(CollectionSetChooser* hrSorted, uint chunk_size) :
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1598 AbstractGangTask("ParKnownGarbageTask"),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1599 _hrSorted(hrSorted), _chunk_size(chunk_size),
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1600 _g1(G1CollectedHeap::heap()) { }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1601
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4727
diff changeset
1602 void work(uint worker_id) {
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1603 ParKnownGarbageHRClosure parKnownGarbageCl(_hrSorted, _chunk_size);
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1604
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1605 // Back to zero for the claim value.
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4727
diff changeset
1606 _g1->heap_region_par_iterate_chunked(&parKnownGarbageCl, worker_id,
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1607 _g1->workers()->active_workers(),
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
1608 HeapRegion::InitialClaimValue);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1609 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1610 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1611
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1612 void
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1613 G1CollectorPolicy::record_concurrent_mark_cleanup_end(int no_of_gc_threads) {
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1614 _collectionSetChooser->clear();
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1615
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1616 uint region_num = _g1->n_regions();
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1779
diff changeset
1617 if (G1CollectedHeap::use_parallel_gc_threads()) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1618 const uint OverpartitionFactor = 4;
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1619 uint WorkUnit;
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1620 // The use of MinChunkSize = 8 in the original code
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1621 // causes some assertion failures when the total number of
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1622 // region is less than 8. The code here tries to fix that.
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1623 // Should the original code also be fixed?
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1624 if (no_of_gc_threads > 0) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1625 const uint MinWorkUnit = MAX2(region_num / no_of_gc_threads, 1U);
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1626 WorkUnit = MAX2(region_num / (no_of_gc_threads * OverpartitionFactor),
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1627 MinWorkUnit);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1628 } else {
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1629 assert(no_of_gc_threads > 0,
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1630 "The active gc workers should be greater than 0");
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1631 // In a product build do something reasonable to avoid a crash.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1632 const uint MinWorkUnit = MAX2(region_num / (uint) ParallelGCThreads, 1U);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1633 WorkUnit =
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1634 MAX2(region_num / (uint) (ParallelGCThreads * OverpartitionFactor),
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1635 MinWorkUnit);
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1636 }
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1637 _collectionSetChooser->prepare_for_par_region_addition(_g1->n_regions(),
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1638 WorkUnit);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1639 ParKnownGarbageTask parKnownGarbageTask(_collectionSetChooser,
1571
2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb
kvn
parents: 1394
diff changeset
1640 (int) WorkUnit);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1641 _g1->workers()->run_task(&parKnownGarbageTask);
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
1642
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
1643 assert(_g1->check_heap_region_claim_values(HeapRegion::InitialClaimValue),
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 342
diff changeset
1644 "sanity check");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1645 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1646 KnownGarbageClosure knownGarbagecl(_collectionSetChooser);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1647 _g1->heap_region_iterate(&knownGarbagecl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1648 }
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1649
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1650 _collectionSetChooser->sort_regions();
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1651
4013
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1652 double end_sec = os::elapsedTime();
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1653 double elapsed_time_ms = (end_sec - _mark_cleanup_start_sec) * 1000.0;
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1654 _concurrent_mark_cleanup_times_ms->add(elapsed_time_ms);
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1655 _cur_mark_stop_world_time_ms += elapsed_time_ms;
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1656 _prev_collection_pause_end_ms += elapsed_time_ms;
074f0252cc13 7088680: G1: Cleanup in the G1CollectorPolicy class
tonyp
parents: 3986
diff changeset
1657 _mmu_tracker->add_pause(_mark_cleanup_start_sec, end_sec, true);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1658 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1659
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1660 // Add the heap region at the head of the non-incremental collection set
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1661 void G1CollectorPolicy::add_old_region_to_cset(HeapRegion* hr) {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1662 assert(_inc_cset_build_state == Active, "Precondition");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1663 assert(!hr->is_young(), "non-incremental add of young region");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1664
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1665 assert(!hr->in_collection_set(), "should not already be in the CSet");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1666 hr->set_in_collection_set(true);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1667 hr->set_next_in_collection_set(_collection_set);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1668 _collection_set = hr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1669 _collection_set_bytes_used_before += hr->used();
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 470
diff changeset
1670 _g1->register_region_with_in_cset_fast_test(hr);
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1671 size_t rs_length = hr->rem_set()->occupied();
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1672 _recorded_rs_lengths += rs_length;
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1673 _old_cset_region_length += 1;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1674 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1675
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1676 // Initialize the per-collection-set information
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1677 void G1CollectorPolicy::start_incremental_cset_building() {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1678 assert(_inc_cset_build_state == Inactive, "Precondition");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1679
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1680 _inc_cset_head = NULL;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1681 _inc_cset_tail = NULL;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1682 _inc_cset_bytes_used_before = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1683
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1684 _inc_cset_max_finger = 0;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1685 _inc_cset_recorded_rs_lengths = 0;
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1686 _inc_cset_recorded_rs_lengths_diffs = 0;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1687 _inc_cset_predicted_elapsed_time_ms = 0.0;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1688 _inc_cset_predicted_elapsed_time_ms_diffs = 0.0;
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1689 _inc_cset_build_state = Active;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1690 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1691
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1692 void G1CollectorPolicy::finalize_incremental_cset_building() {
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1693 assert(_inc_cset_build_state == Active, "Precondition");
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1694 assert(SafepointSynchronize::is_at_safepoint(), "should be at a safepoint");
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1695
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1696 // The two "main" fields, _inc_cset_recorded_rs_lengths and
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1697 // _inc_cset_predicted_elapsed_time_ms, are updated by the thread
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1698 // that adds a new region to the CSet. Further updates by the
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1699 // concurrent refinement thread that samples the young RSet lengths
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1700 // are accumulated in the *_diffs fields. Here we add the diffs to
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1701 // the "main" fields.
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1702
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1703 if (_inc_cset_recorded_rs_lengths_diffs >= 0) {
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1704 _inc_cset_recorded_rs_lengths += _inc_cset_recorded_rs_lengths_diffs;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1705 } else {
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1706 // This is defensive. The diff should in theory be always positive
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1707 // as RSets can only grow between GCs. However, given that we
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1708 // sample their size concurrently with other threads updating them
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1709 // it's possible that we might get the wrong size back, which
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1710 // could make the calculations somewhat inaccurate.
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1711 size_t diffs = (size_t) (-_inc_cset_recorded_rs_lengths_diffs);
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1712 if (_inc_cset_recorded_rs_lengths >= diffs) {
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1713 _inc_cset_recorded_rs_lengths -= diffs;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1714 } else {
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1715 _inc_cset_recorded_rs_lengths = 0;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1716 }
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1717 }
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1718 _inc_cset_predicted_elapsed_time_ms +=
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1719 _inc_cset_predicted_elapsed_time_ms_diffs;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1720
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1721 _inc_cset_recorded_rs_lengths_diffs = 0;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1722 _inc_cset_predicted_elapsed_time_ms_diffs = 0.0;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1723 }
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1724
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1725 void G1CollectorPolicy::add_to_incremental_cset_info(HeapRegion* hr, size_t rs_length) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1726 // This routine is used when:
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1727 // * adding survivor regions to the incremental cset at the end of an
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1728 // evacuation pause,
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1729 // * adding the current allocation region to the incremental cset
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1730 // when it is retired, and
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1731 // * updating existing policy information for a region in the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1732 // incremental cset via young list RSet sampling.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1733 // Therefore this routine may be called at a safepoint by the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1734 // VM thread, or in-between safepoints by mutator threads (when
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1735 // retiring the current allocation region) or a concurrent
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1736 // refine thread (RSet sampling).
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1737
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1738 double region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, gcs_are_young());
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1739 size_t used_bytes = hr->used();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1740 _inc_cset_recorded_rs_lengths += rs_length;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1741 _inc_cset_predicted_elapsed_time_ms += region_elapsed_time_ms;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1742 _inc_cset_bytes_used_before += used_bytes;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1743
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1744 // Cache the values we have added to the aggregated informtion
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1745 // in the heap region in case we have to remove this region from
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1746 // the incremental collection set, or it is updated by the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1747 // rset sampling code
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1748 hr->set_recorded_rs_length(rs_length);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1749 hr->set_predicted_elapsed_time_ms(region_elapsed_time_ms);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1750 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1751
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1752 void G1CollectorPolicy::update_incremental_cset_info(HeapRegion* hr,
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1753 size_t new_rs_length) {
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1754 // Update the CSet information that is dependent on the new RS length
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1755 assert(hr->is_young(), "Precondition");
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1756 assert(!SafepointSynchronize::is_at_safepoint(),
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1757 "should not be at a safepoint");
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1758
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1759 // We could have updated _inc_cset_recorded_rs_lengths and
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1760 // _inc_cset_predicted_elapsed_time_ms directly but we'd need to do
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1761 // that atomically, as this code is executed by a concurrent
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1762 // refinement thread, potentially concurrently with a mutator thread
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1763 // allocating a new region and also updating the same fields. To
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1764 // avoid the atomic operations we accumulate these updates on two
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1765 // separate fields (*_diffs) and we'll just add them to the "main"
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1766 // fields at the start of a GC.
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1767
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1768 ssize_t old_rs_length = (ssize_t) hr->recorded_rs_length();
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1769 ssize_t rs_lengths_diff = (ssize_t) new_rs_length - old_rs_length;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1770 _inc_cset_recorded_rs_lengths_diffs += rs_lengths_diff;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1771
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1772 double old_elapsed_time_ms = hr->predicted_elapsed_time_ms();
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1773 double new_region_elapsed_time_ms = predict_region_elapsed_time_ms(hr, gcs_are_young());
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1774 double elapsed_ms_diff = new_region_elapsed_time_ms - old_elapsed_time_ms;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1775 _inc_cset_predicted_elapsed_time_ms_diffs += elapsed_ms_diff;
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1776
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1777 hr->set_recorded_rs_length(new_rs_length);
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1778 hr->set_predicted_elapsed_time_ms(new_region_elapsed_time_ms);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1779 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1780
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1781 void G1CollectorPolicy::add_region_to_incremental_cset_common(HeapRegion* hr) {
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1782 assert(hr->is_young(), "invariant");
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1783 assert(hr->young_index_in_cset() > -1, "should have already been set");
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1784 assert(_inc_cset_build_state == Active, "Precondition");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1785
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1786 // We need to clear and set the cached recorded/cached collection set
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1787 // information in the heap region here (before the region gets added
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1788 // to the collection set). An individual heap region's cached values
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1789 // are calculated, aggregated with the policy collection set info,
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1790 // and cached in the heap region here (initially) and (subsequently)
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1791 // by the Young List sampling code.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1792
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1793 size_t rs_length = hr->rem_set()->occupied();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1794 add_to_incremental_cset_info(hr, rs_length);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1795
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1796 HeapWord* hr_end = hr->end();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1797 _inc_cset_max_finger = MAX2(_inc_cset_max_finger, hr_end);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1798
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1799 assert(!hr->in_collection_set(), "invariant");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1800 hr->set_in_collection_set(true);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1801 assert( hr->next_in_collection_set() == NULL, "invariant");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1802
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1803 _g1->register_region_with_in_cset_fast_test(hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1804 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1805
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1806 // Add the region at the RHS of the incremental cset
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1807 void G1CollectorPolicy::add_region_to_incremental_cset_rhs(HeapRegion* hr) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1808 // We should only ever be appending survivors at the end of a pause
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1809 assert( hr->is_survivor(), "Logic");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1810
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1811 // Do the 'common' stuff
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1812 add_region_to_incremental_cset_common(hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1813
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1814 // Now add the region at the right hand side
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1815 if (_inc_cset_tail == NULL) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1816 assert(_inc_cset_head == NULL, "invariant");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1817 _inc_cset_head = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1818 } else {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1819 _inc_cset_tail->set_next_in_collection_set(hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1820 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1821 _inc_cset_tail = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1822 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1823
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1824 // Add the region to the LHS of the incremental cset
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1825 void G1CollectorPolicy::add_region_to_incremental_cset_lhs(HeapRegion* hr) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1826 // Survivors should be added to the RHS at the end of a pause
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1827 assert(!hr->is_survivor(), "Logic");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1828
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1829 // Do the 'common' stuff
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1830 add_region_to_incremental_cset_common(hr);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1831
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1832 // Add the region at the left hand side
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1833 hr->set_next_in_collection_set(_inc_cset_head);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1834 if (_inc_cset_head == NULL) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1835 assert(_inc_cset_tail == NULL, "Invariant");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1836 _inc_cset_tail = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1837 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1838 _inc_cset_head = hr;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1839 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1840
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1841 #ifndef PRODUCT
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1842 void G1CollectorPolicy::print_collection_set(HeapRegion* list_head, outputStream* st) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1843 assert(list_head == inc_cset_head() || list_head == collection_set(), "must be");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1844
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1845 st->print_cr("\nCollection_set:");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1846 HeapRegion* csr = list_head;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1847 while (csr != NULL) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1848 HeapRegion* next = csr->next_in_collection_set();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1849 assert(csr->in_collection_set(), "bad CS");
6027
8a2e5a6a19a4 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 6011
diff changeset
1850 st->print_cr(" "HR_FORMAT", P: "PTR_FORMAT "N: "PTR_FORMAT", age: %4d",
8a2e5a6a19a4 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 6011
diff changeset
1851 HR_FORMAT_PARAMS(csr),
8a2e5a6a19a4 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 6011
diff changeset
1852 csr->prev_top_at_mark_start(), csr->next_top_at_mark_start(),
8a2e5a6a19a4 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 6011
diff changeset
1853 csr->age_in_surv_rate_group_cond());
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1854 csr = next;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1855 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1856 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1857 #endif // !PRODUCT
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1858
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1859 double G1CollectorPolicy::reclaimable_bytes_perc(size_t reclaimable_bytes) {
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1860 // Returns the given amount of reclaimable bytes (that represents
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1861 // the amount of reclaimable space still to be collected) as a
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1862 // percentage of the current heap capacity.
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1863 size_t capacity_bytes = _g1->capacity();
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1864 return (double) reclaimable_bytes * 100.0 / (double) capacity_bytes;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1865 }
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1866
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1867 bool G1CollectorPolicy::next_gc_should_be_mixed(const char* true_action_str,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1868 const char* false_action_str) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1869 CollectionSetChooser* cset_chooser = _collectionSetChooser;
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1870 if (cset_chooser->is_empty()) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1871 ergo_verbose0(ErgoMixedGCs,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1872 false_action_str,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1873 ergo_format_reason("candidate old regions not available"));
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1874 return false;
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1875 }
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1876
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1877 // Is the amount of uncollected reclaimable space above G1HeapWastePercent?
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1878 size_t reclaimable_bytes = cset_chooser->remaining_reclaimable_bytes();
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1879 double reclaimable_perc = reclaimable_bytes_perc(reclaimable_bytes);
5964
21595f05bc93 7146246: G1: expose some of the -XX flags that drive which old regions to collect during mixed GCs
tonyp
parents: 4912
diff changeset
1880 double threshold = (double) G1HeapWastePercent;
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1881 if (reclaimable_perc <= threshold) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1882 ergo_verbose4(ErgoMixedGCs,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1883 false_action_str,
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1884 ergo_format_reason("reclaimable percentage not over threshold")
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1885 ergo_format_region("candidate old regions")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1886 ergo_format_byte_perc("reclaimable")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1887 ergo_format_perc("threshold"),
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1888 cset_chooser->remaining_regions(),
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1889 reclaimable_bytes,
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1890 reclaimable_perc, threshold);
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1891 return false;
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1892 }
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1893
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1894 ergo_verbose4(ErgoMixedGCs,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1895 true_action_str,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1896 ergo_format_reason("candidate old regions available")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1897 ergo_format_region("candidate old regions")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1898 ergo_format_byte_perc("reclaimable")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1899 ergo_format_perc("threshold"),
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
1900 cset_chooser->remaining_regions(),
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1901 reclaimable_bytes,
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1902 reclaimable_perc, threshold);
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1903 return true;
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1904 }
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
1905
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1906 uint G1CollectorPolicy::calc_min_old_cset_length() {
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1907 // The min old CSet region bound is based on the maximum desired
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1908 // number of mixed GCs after a cycle. I.e., even if some old regions
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1909 // look expensive, we should add them to the CSet anyway to make
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1910 // sure we go through the available old regions in no more than the
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1911 // maximum desired number of mixed GCs.
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1912 //
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1913 // The calculation is based on the number of marked regions we added
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1914 // to the CSet chooser in the first place, not how many remain, so
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1915 // that the result is the same during all mixed GCs that follow a cycle.
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1916
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1917 const size_t region_num = (size_t) _collectionSetChooser->length();
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1918 const size_t gc_num = (size_t) MAX2(G1MixedGCCountTarget, (uintx) 1);
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1919 size_t result = region_num / gc_num;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1920 // emulate ceiling
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1921 if (result * gc_num < region_num) {
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1922 result += 1;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1923 }
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1924 return (uint) result;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1925 }
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1926
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1927 uint G1CollectorPolicy::calc_max_old_cset_length() {
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1928 // The max old CSet region bound is based on the threshold expressed
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1929 // as a percentage of the heap size. I.e., it should bound the
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1930 // number of old regions added to the CSet irrespective of how many
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1931 // of them are available.
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1932
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1933 G1CollectedHeap* g1h = G1CollectedHeap::heap();
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1934 const size_t region_num = g1h->n_regions();
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1935 const size_t perc = (size_t) G1OldCSetRegionThresholdPercent;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1936 size_t result = region_num * perc / 100;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1937 // emulate ceiling
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1938 if (100 * result < region_num * perc) {
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1939 result += 1;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1940 }
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1941 return (uint) result;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1942 }
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1943
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1944
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10291
diff changeset
1945 void G1CollectorPolicy::finalize_cset(double target_pause_time_ms, EvacuationInfo& evacuation_info) {
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1946 double young_start_time_sec = os::elapsedTime();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
1947
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1948 YoungList* young_list = _g1->young_list();
4727
67fdcb391461 7119027: G1: use atomics to update RS length / predict time of inc CSet
tonyp
parents: 4710
diff changeset
1949 finalize_incremental_cset_building();
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1950
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1951 guarantee(target_pause_time_ms > 0.0,
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1952 err_msg("target_pause_time_ms = %1.6lf should be positive",
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1953 target_pause_time_ms));
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1954 guarantee(_collection_set == NULL, "Precondition");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1955
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1956 double base_time_ms = predict_base_elapsed_time_ms(_pending_cards);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1957 double predicted_pause_time_ms = base_time_ms;
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1958 double time_remaining_ms = MAX2(target_pause_time_ms - base_time_ms, 0.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1959
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1960 ergo_verbose4(ErgoCSetConstruction | ErgoHigh,
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1961 "start choosing CSet",
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1962 ergo_format_size("_pending_cards")
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1963 ergo_format_ms("predicted base time")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1964 ergo_format_ms("remaining time")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1965 ergo_format_ms("target pause time"),
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1966 _pending_cards, base_time_ms, time_remaining_ms, target_pause_time_ms);
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1967
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1968 _last_gc_was_young = gcs_are_young() ? true : false;
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1969
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
1970 if (_last_gc_was_young) {
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
1971 _trace_gen0_time_data.increment_young_collection_count();
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1972 } else {
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
1973 _trace_gen0_time_data.increment_mixed_collection_count();
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1974 }
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1975
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1976 // The young list is laid with the survivor regions from the previous
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1977 // pause are appended to the RHS of the young list, i.e.
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1978 // [Newly Young Regions ++ Survivors from last pause].
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1979
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1980 uint survivor_region_length = young_list->survivor_length();
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
1981 uint eden_region_length = young_list->length() - survivor_region_length;
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
1982 init_cset_region_lengths(eden_region_length, survivor_region_length);
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1983
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
1984 HeapRegion* hr = young_list->first_survivor_region();
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1985 while (hr != NULL) {
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1986 assert(hr->is_survivor(), "badly formed young list");
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1987 hr->set_young();
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1988 hr = hr->get_next_young_region();
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1989 }
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1990
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1991 // Clear the fields that point to the survivor list - they are all young now.
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1992 young_list->clear_survivors();
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1993
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1994 _collection_set = _inc_cset_head;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1995 _collection_set_bytes_used_before = _inc_cset_bytes_used_before;
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
1996 time_remaining_ms = MAX2(time_remaining_ms - _inc_cset_predicted_elapsed_time_ms, 0.0);
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1997 predicted_pause_time_ms += _inc_cset_predicted_elapsed_time_ms;
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
1998
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
1999 ergo_verbose3(ErgoCSetConstruction | ErgoHigh,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2000 "add young regions to CSet",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2001 ergo_format_region("eden")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2002 ergo_format_region("survivors")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2003 ergo_format_ms("predicted young region time"),
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
2004 eden_region_length, survivor_region_length,
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2005 _inc_cset_predicted_elapsed_time_ms);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2006
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2007 // The number of recorded young regions is the incremental
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2008 // collection set's current size
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2009 set_recorded_rs_lengths(_inc_cset_recorded_rs_lengths);
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2010
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2011 double young_end_time_sec = os::elapsedTime();
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2012 phase_times()->record_young_cset_choice_time_ms((young_end_time_sec - young_start_time_sec) * 1000.0);
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2013
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
2014 // Set the start of the non-young choice time.
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
2015 double non_young_start_time_sec = young_end_time_sec;
3867
ff53346271fe 6814390: G1: remove the concept of non-generational G1
brutisso
parents: 3830
diff changeset
2016
4710
41406797186b 7113012: G1: rename not-fully-young GCs as "mixed"
tonyp
parents: 4130
diff changeset
2017 if (!gcs_are_young()) {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2018 CollectionSetChooser* cset_chooser = _collectionSetChooser;
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
2019 cset_chooser->verify();
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2020 const uint min_old_cset_length = calc_min_old_cset_length();
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2021 const uint max_old_cset_length = calc_max_old_cset_length();
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
2022
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6007
diff changeset
2023 uint expensive_region_num = 0;
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2024 bool check_time_remaining = adaptive_young_list_length();
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
2025
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2026 HeapRegion* hr = cset_chooser->peek();
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2027 while (hr != NULL) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2028 if (old_cset_region_length() >= max_old_cset_length) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2029 // Added maximum number of old regions to the CSet.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2030 ergo_verbose2(ErgoCSetConstruction,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2031 "finish adding old regions to CSet",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2032 ergo_format_reason("old CSet region num reached max")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2033 ergo_format_region("old")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2034 ergo_format_region("max"),
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2035 old_cset_region_length(), max_old_cset_length);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2036 break;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2037 }
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2038
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2039
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2040 // Stop adding regions if the remaining reclaimable space is
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2041 // not above G1HeapWastePercent.
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2042 size_t reclaimable_bytes = cset_chooser->remaining_reclaimable_bytes();
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2043 double reclaimable_perc = reclaimable_bytes_perc(reclaimable_bytes);
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2044 double threshold = (double) G1HeapWastePercent;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2045 if (reclaimable_perc <= threshold) {
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2046 // We've added enough old regions that the amount of uncollected
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2047 // reclaimable space is at or below the waste threshold. Stop
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2048 // adding old regions to the CSet.
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2049 ergo_verbose5(ErgoCSetConstruction,
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2050 "finish adding old regions to CSet",
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2051 ergo_format_reason("reclaimable percentage not over threshold")
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2052 ergo_format_region("old")
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2053 ergo_format_region("max")
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2054 ergo_format_byte_perc("reclaimable")
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2055 ergo_format_perc("threshold"),
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2056 old_cset_region_length(),
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2057 max_old_cset_length,
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2058 reclaimable_bytes,
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2059 reclaimable_perc, threshold);
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2060 break;
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2061 }
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2062
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6254
diff changeset
2063 double predicted_time_ms = predict_region_elapsed_time_ms(hr, gcs_are_young());
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2064 if (check_time_remaining) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2065 if (predicted_time_ms > time_remaining_ms) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2066 // Too expensive for the current CSet.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2067
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2068 if (old_cset_region_length() >= min_old_cset_length) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2069 // We have added the minimum number of old regions to the CSet,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2070 // we are done with this CSet.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2071 ergo_verbose4(ErgoCSetConstruction,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2072 "finish adding old regions to CSet",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2073 ergo_format_reason("predicted time is too high")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2074 ergo_format_ms("predicted time")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2075 ergo_format_ms("remaining time")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2076 ergo_format_region("old")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2077 ergo_format_region("min"),
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2078 predicted_time_ms, time_remaining_ms,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2079 old_cset_region_length(), min_old_cset_length);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2080 break;
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2081 }
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2082
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2083 // We'll add it anyway given that we haven't reached the
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2084 // minimum number of old regions.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2085 expensive_region_num += 1;
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2086 }
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2087 } else {
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2088 if (old_cset_region_length() >= min_old_cset_length) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2089 // In the non-auto-tuning case, we'll finish adding regions
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2090 // to the CSet if we reach the minimum.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2091 ergo_verbose2(ErgoCSetConstruction,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2092 "finish adding old regions to CSet",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2093 ergo_format_reason("old CSet region num reached min")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2094 ergo_format_region("old")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2095 ergo_format_region("min"),
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2096 old_cset_region_length(), min_old_cset_length);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2097 break;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2098 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2099 }
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2100
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2101 // We will add this region to the CSet.
8681
27714220e50e 8007036: G1: Too many old regions added to last mixed GC
johnc
parents: 8094
diff changeset
2102 time_remaining_ms = MAX2(time_remaining_ms - predicted_time_ms, 0.0);
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2103 predicted_pause_time_ms += predicted_time_ms;
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2104 cset_chooser->remove_and_move_to_next(hr);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2105 _g1->old_set_remove(hr);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2106 add_old_region_to_cset(hr);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2107
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2108 hr = cset_chooser->peek();
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2109 }
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2110 if (hr == NULL) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2111 ergo_verbose0(ErgoCSetConstruction,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2112 "finish adding old regions to CSet",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2113 ergo_format_reason("candidate old regions not available"));
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2114 }
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2115
4912
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2116 if (expensive_region_num > 0) {
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2117 // We print the information once here at the end, predicated on
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2118 // whether we added any apparently expensive regions or not, to
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2119 // avoid generating output per region.
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2120 ergo_verbose4(ErgoCSetConstruction,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2121 "added expensive regions to CSet",
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2122 ergo_format_reason("old CSet region num not reached min")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2123 ergo_format_region("old")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2124 ergo_format_region("expensive")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2125 ergo_format_region("min")
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2126 ergo_format_ms("remaining time"),
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2127 old_cset_region_length(),
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2128 expensive_region_num,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2129 min_old_cset_length,
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2130 time_remaining_ms);
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2131 }
a9647476d1a4 7132029: G1: mixed GC phase lasts for longer than it should
tonyp
parents: 4837
diff changeset
2132
6011
f7a8920427a6 7145441: G1: collection set chooser-related cleanup
tonyp
parents: 6010
diff changeset
2133 cset_chooser->verify();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2134 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2135
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2136 stop_incremental_cset_building();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2137
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2138 ergo_verbose5(ErgoCSetConstruction,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2139 "finish choosing CSet",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2140 ergo_format_region("eden")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2141 ergo_format_region("survivors")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2142 ergo_format_region("old")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2143 ergo_format_ms("predicted pause time")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2144 ergo_format_ms("target pause time"),
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
2145 eden_region_length, survivor_region_length,
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4072
diff changeset
2146 old_cset_region_length(),
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2147 predicted_pause_time_ms, target_pause_time_ms);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3868
diff changeset
2148
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2149 double non_young_end_time_sec = os::elapsedTime();
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2150 phase_times()->record_non_young_cset_choice_time_ms((non_young_end_time_sec - non_young_start_time_sec) * 1000.0);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10291
diff changeset
2151 evacuation_info.set_collectionset_regions(cset_region_length());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2152 }
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2153
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2154 void TraceGen0TimeData::record_start_collection(double time_to_stop_the_world_ms) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2155 if(TraceGen0Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2156 _all_stop_world_times_ms.add(time_to_stop_the_world_ms);
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2157 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2158 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2159
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2160 void TraceGen0TimeData::record_yield_time(double yield_time_ms) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2161 if(TraceGen0Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2162 _all_yield_times_ms.add(yield_time_ms);
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2163 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2164 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2165
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2166 void TraceGen0TimeData::record_end_collection(double pause_time_ms, G1GCPhaseTimes* phase_times) {
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2167 if(TraceGen0Time) {
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2168 _total.add(pause_time_ms);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2169 _other.add(pause_time_ms - phase_times->accounted_time_ms());
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2170 _root_region_scan_wait.add(phase_times->root_region_scan_wait_time_ms());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2171 _parallel.add(phase_times->cur_collection_par_time_ms());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2172 _ext_root_scan.add(phase_times->average_last_ext_root_scan_time());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2173 _satb_filtering.add(phase_times->average_last_satb_filtering_times_ms());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2174 _update_rs.add(phase_times->average_last_update_rs_time());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2175 _scan_rs.add(phase_times->average_last_scan_rs_time());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2176 _obj_copy.add(phase_times->average_last_obj_copy_time());
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2177 _termination.add(phase_times->average_last_termination_time());
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2178
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2179 double parallel_known_time = phase_times->average_last_ext_root_scan_time() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2180 phase_times->average_last_satb_filtering_times_ms() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2181 phase_times->average_last_update_rs_time() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2182 phase_times->average_last_scan_rs_time() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2183 phase_times->average_last_obj_copy_time() +
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2184 + phase_times->average_last_termination_time();
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2185
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2186 double parallel_other_time = phase_times->cur_collection_par_time_ms() - parallel_known_time;
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2187 _parallel_other.add(parallel_other_time);
6628
bb3f6194fedb 7178363: G1: Remove the serial code for PrintGCDetails and make it a special case of the parallel code
brutisso
parents: 6611
diff changeset
2188 _clear_ct.add(phase_times->cur_clear_ct_time_ms());
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2189 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2190 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2191
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2192 void TraceGen0TimeData::increment_young_collection_count() {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2193 if(TraceGen0Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2194 ++_young_pause_num;
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2195 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2196 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2197
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2198 void TraceGen0TimeData::increment_mixed_collection_count() {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2199 if(TraceGen0Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2200 ++_mixed_pause_num;
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2201 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2202 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2203
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2204 void TraceGen0TimeData::print_summary(const char* str,
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2205 const NumberSeq* seq) const {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2206 double sum = seq->sum();
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2207 gclog_or_tty->print_cr("%-27s = %8.2lf s (avg = %8.2lf ms)",
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2208 str, sum / 1000.0, seq->avg());
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2209 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2210
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2211 void TraceGen0TimeData::print_summary_sd(const char* str,
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2212 const NumberSeq* seq) const {
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2213 print_summary(str, seq);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2214 gclog_or_tty->print_cr("%+45s = %5d, std dev = %8.2lf ms, max = %8.2lf ms)",
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2215 "(num", seq->num(), seq->sd(), seq->maximum());
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2216 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2217
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2218 void TraceGen0TimeData::print() const {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2219 if (!TraceGen0Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2220 return;
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2221 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2222
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2223 gclog_or_tty->print_cr("ALL PAUSES");
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2224 print_summary_sd(" Total", &_total);
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2225 gclog_or_tty->print_cr("");
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2226 gclog_or_tty->print_cr("");
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2227 gclog_or_tty->print_cr(" Young GC Pauses: %8d", _young_pause_num);
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2228 gclog_or_tty->print_cr(" Mixed GC Pauses: %8d", _mixed_pause_num);
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2229 gclog_or_tty->print_cr("");
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2230
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2231 gclog_or_tty->print_cr("EVACUATION PAUSES");
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2232
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2233 if (_young_pause_num == 0 && _mixed_pause_num == 0) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2234 gclog_or_tty->print_cr("none");
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2235 } else {
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2236 print_summary_sd(" Evacuation Pauses", &_total);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2237 print_summary(" Root Region Scan Wait", &_root_region_scan_wait);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2238 print_summary(" Parallel Time", &_parallel);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2239 print_summary(" Ext Root Scanning", &_ext_root_scan);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2240 print_summary(" SATB Filtering", &_satb_filtering);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2241 print_summary(" Update RS", &_update_rs);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2242 print_summary(" Scan RS", &_scan_rs);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2243 print_summary(" Object Copy", &_obj_copy);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2244 print_summary(" Termination", &_termination);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2245 print_summary(" Parallel Other", &_parallel_other);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2246 print_summary(" Clear CT", &_clear_ct);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2247 print_summary(" Other", &_other);
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2248 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2249 gclog_or_tty->print_cr("");
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2250
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2251 gclog_or_tty->print_cr("MISC");
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2252 print_summary_sd(" Stop World", &_all_stop_world_times_ms);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6109
diff changeset
2253 print_summary_sd(" Yields", &_all_yield_times_ms);
6109
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2254 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2255
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2256 void TraceGen1TimeData::record_full_collection(double full_gc_time_ms) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2257 if (TraceGen1Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2258 _all_full_gc_times.add(full_gc_time_ms);
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2259 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2260 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2261
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2262 void TraceGen1TimeData::print() const {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2263 if (!TraceGen1Time) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2264 return;
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2265 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2266
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2267 if (_all_full_gc_times.num() > 0) {
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2268 gclog_or_tty->print("\n%4d full_gcs: total time = %8.2f s",
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2269 _all_full_gc_times.num(),
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2270 _all_full_gc_times.sum() / 1000.0);
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2271 gclog_or_tty->print_cr(" (avg = %8.2fms).", _all_full_gc_times.avg());
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2272 gclog_or_tty->print_cr(" [std. dev = %8.2f ms, max = %8.2f ms]",
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2273 _all_full_gc_times.sd(),
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2274 _all_full_gc_times.maximum());
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2275 }
bbc900c2482a 7172279: G1: Clean up TraceGen0Time and TraceGen1Time data gathering
brutisso
parents: 6064
diff changeset
2276 }