annotate src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @ 23569:f3f2f71d2dc8

8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure> Summary: The crash was caused by a faulty eager humongous reclaim. The reason for reclaiming a live object was that the call to cleanupHRRS was done after dirtying cards and clearing the remembered sets for the humongous object. This could lead to one or many cards being missed. Reviewed-by: tbenson, kbarrett, tschatzl
author dbuck
date Tue, 19 Jan 2016 18:16:40 +0000
parents 047a642c9729
children 8daf136b3218
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 /*
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
2 * Copyright (c) 2001, 2015, 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: 1547
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1547
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: 1547
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
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
25 #if !defined(__clang_major__) && defined(__GNUC__)
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
26 #define ATTRIBUTE_PRINTF(x,y) // FIXME, formats are a mess.
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
27 #endif
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
28
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
29 #include "precompiled.hpp"
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
30 #include "classfile/metadataOnStackMark.hpp"
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
31 #include "code/codeCache.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
32 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
33 #include "gc_implementation/g1/bufferingOopClosure.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
34 #include "gc_implementation/g1/concurrentG1Refine.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
35 #include "gc_implementation/g1/concurrentG1RefineThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
36 #include "gc_implementation/g1/concurrentMarkThread.inline.hpp"
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
37 #include "gc_implementation/g1/g1AllocRegion.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
38 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
39 #include "gc_implementation/g1/g1CollectorPolicy.hpp"
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
40 #include "gc_implementation/g1/g1ErgoVerbose.hpp"
4783
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
41 #include "gc_implementation/g1/g1EvacFailure.hpp"
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
42 #include "gc_implementation/g1/g1GCPhaseTimes.hpp"
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5987
diff changeset
43 #include "gc_implementation/g1/g1Log.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
44 #include "gc_implementation/g1/g1MarkSweep.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
45 #include "gc_implementation/g1/g1OopClosures.inline.hpp"
20223
b0c374311c4e 8035400: Move G1ParScanThreadState into its own files
tschatzl
parents: 20217
diff changeset
46 #include "gc_implementation/g1/g1ParScanThreadState.inline.hpp"
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
47 #include "gc_implementation/g1/g1RegionToSpaceMapper.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
48 #include "gc_implementation/g1/g1RemSet.inline.hpp"
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
49 #include "gc_implementation/g1/g1RootProcessor.hpp"
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
50 #include "gc_implementation/g1/g1StringDedup.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
51 #include "gc_implementation/g1/g1YCTypes.hpp"
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
52 #include "gc_implementation/g1/heapRegion.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
53 #include "gc_implementation/g1/heapRegionRemSet.hpp"
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
54 #include "gc_implementation/g1/heapRegionSet.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
55 #include "gc_implementation/g1/vm_operations_g1.hpp"
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
56 #include "gc_implementation/shared/gcHeapSummary.hpp"
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
57 #include "gc_implementation/shared/gcTimer.hpp"
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
58 #include "gc_implementation/shared/gcTrace.hpp"
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
59 #include "gc_implementation/shared/gcTraceTime.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
60 #include "gc_implementation/shared/isGCActiveMark.hpp"
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
61 #include "memory/allocation.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
62 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
63 #include "memory/generationSpec.hpp"
17636
889068b9a088 8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents: 17634
diff changeset
64 #include "memory/iterator.hpp"
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
65 #include "memory/referenceProcessor.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
66 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
67 #include "oops/oop.pcgc.inline.hpp"
20197
ce8f6bb717c9 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 20192
diff changeset
68 #include "runtime/orderAccess.inline.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1960
diff changeset
69 #include "runtime/vmThread.hpp"
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
70
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
71 size_t G1CollectedHeap::_humongous_object_threshold_in_words = 0;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
72
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
73 // turn it on so that the contents of the young list (scan-only /
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
74 // to-be-collected) are printed at "strategic" points before / during
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
75 // / after the collection --- this is useful for debugging
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
76 #define YOUNG_LIST_VERBOSE 0
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
77 // CURRENT STATUS
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
78 // This file is under construction. Search for "FIXME".
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 // INVARIANTS/NOTES
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
81 //
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
82 // All allocation activity covered by the G1CollectedHeap interface is
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
83 // serialized by acquiring the HeapLock. This happens in mem_allocate
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
84 // and allocate_new_tlab, which are the "entry" points to the
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
85 // allocation code from the rest of the JVM. (Note that this does not
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
86 // apply to TLAB allocation, which is not part of this interface: it
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
87 // is done by clients of this interface.)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
88
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
89 // Local to this file.
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 class RefineCardTableEntryClosure: public CardTableEntryClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
92 bool _concurrent;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
93 public:
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
94 RefineCardTableEntryClosure() : _concurrent(true) { }
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
95
17844
8847586c9037 8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents: 17833
diff changeset
96 bool do_card_ptr(jbyte* card_ptr, uint worker_i) {
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
97 bool oops_into_cset = G1CollectedHeap::heap()->g1_rem_set()->refine_card(card_ptr, worker_i, false);
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
98 // This path is executed by the concurrent refine or mutator threads,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
99 // concurrently, and so we do not care if card_ptr contains references
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
100 // that point into the collection set.
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
101 assert(!oops_into_cset, "should be");
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
102
20192
581e70386ec9 8039147: Cleanup SuspendibleThreadSet
pliden
parents: 20191
diff changeset
103 if (_concurrent && SuspendibleThreadSet::should_yield()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
104 // Caller will actually yield.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
105 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
106 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
107 // Otherwise, we finished successfully; return true.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
108 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
109 }
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
110
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
111 void set_concurrent(bool b) { _concurrent = b; }
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
114
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
115 class ClearLoggedCardTableEntryClosure: public CardTableEntryClosure {
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
116 size_t _num_processed;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
117 CardTableModRefBS* _ctbs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
118 int _histo[256];
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
119
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
120 public:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
121 ClearLoggedCardTableEntryClosure() :
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
122 _num_processed(0), _ctbs(G1CollectedHeap::heap()->g1_barrier_set())
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
123 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
124 for (int i = 0; i < 256; i++) _histo[i] = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
125 }
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
126
17844
8847586c9037 8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents: 17833
diff changeset
127 bool do_card_ptr(jbyte* card_ptr, uint worker_i) {
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
128 unsigned char* ujb = (unsigned char*)card_ptr;
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
129 int ind = (int)(*ujb);
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
130 _histo[ind]++;
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
131
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
132 *card_ptr = (jbyte)CardTableModRefBS::clean_card_val();
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
133 _num_processed++;
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
134
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
135 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
136 }
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
137
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
138 size_t num_processed() { return _num_processed; }
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
139
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
140 void print_histo() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
141 gclog_or_tty->print_cr("Card table value histogram:");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
142 for (int i = 0; i < 256; i++) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
143 if (_histo[i] != 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
144 gclog_or_tty->print_cr(" %d: %d", i, _histo[i]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
145 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
146 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
147 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
148 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
149
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
150 class RedirtyLoggedCardTableEntryClosure : public CardTableEntryClosure {
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
151 private:
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
152 size_t _num_processed;
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
153
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
154 public:
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
155 RedirtyLoggedCardTableEntryClosure() : CardTableEntryClosure(), _num_processed(0) { }
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
156
17844
8847586c9037 8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents: 17833
diff changeset
157 bool do_card_ptr(jbyte* card_ptr, uint worker_i) {
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
158 *card_ptr = CardTableModRefBS::dirty_card_val();
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
159 _num_processed++;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
160 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
161 }
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
162
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
163 size_t num_processed() const { return _num_processed; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
164 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
165
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
166 YoungList::YoungList(G1CollectedHeap* g1h) :
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
167 _g1h(g1h), _head(NULL), _length(0), _last_sampled_rs_lengths(0),
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
168 _survivor_head(NULL), _survivor_tail(NULL), _survivor_length(0) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
169 guarantee(check_list_empty(false), "just making sure...");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
170 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
171
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
172 void YoungList::push_region(HeapRegion *hr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
173 assert(!hr->is_young(), "should not already be young");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
174 assert(hr->get_next_young_region() == NULL, "cause it should!");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
175
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
176 hr->set_next_young_region(_head);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
177 _head = hr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
178
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
179 _g1h->g1_policy()->set_region_eden(hr, (int) _length);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
180 ++_length;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
181 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
182
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
183 void YoungList::add_survivor_region(HeapRegion* hr) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
184 assert(hr->is_survivor(), "should be flagged as survivor region");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
185 assert(hr->get_next_young_region() == NULL, "cause it should!");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
186
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
187 hr->set_next_young_region(_survivor_head);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
188 if (_survivor_head == NULL) {
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
189 _survivor_tail = hr;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
190 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
191 _survivor_head = hr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
192 ++_survivor_length;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
193 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
194
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
195 void YoungList::empty_list(HeapRegion* list) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
196 while (list != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
197 HeapRegion* next = list->get_next_young_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
198 list->set_next_young_region(NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
199 list->uninstall_surv_rate_group();
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
200 // This is called before a Full GC and all the non-empty /
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
201 // non-humongous regions at the end of the Full GC will end up as
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
202 // old anyway.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
203 list->set_old();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
204 list = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
205 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
206 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
207
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
208 void YoungList::empty_list() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
209 assert(check_list_well_formed(), "young list should be well formed");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
210
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
211 empty_list(_head);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
212 _head = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
213 _length = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
214
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
215 empty_list(_survivor_head);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
216 _survivor_head = NULL;
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
217 _survivor_tail = NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
218 _survivor_length = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
219
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
220 _last_sampled_rs_lengths = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
221
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
222 assert(check_list_empty(false), "just making sure...");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
223 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
224
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
225 bool YoungList::check_list_well_formed() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
226 bool ret = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
227
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
228 uint length = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
229 HeapRegion* curr = _head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
230 HeapRegion* last = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
231 while (curr != NULL) {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
232 if (!curr->is_young()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
233 gclog_or_tty->print_cr("### YOUNG REGION "PTR_FORMAT"-"PTR_FORMAT" "
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
234 "incorrectly tagged (y: %d, surv: %d)",
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
235 curr->bottom(), curr->end(),
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
236 curr->is_young(), curr->is_survivor());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
237 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
238 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
239 ++length;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
240 last = curr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
241 curr = curr->get_next_young_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
242 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
243 ret = ret && (length == _length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
244
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
245 if (!ret) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
246 gclog_or_tty->print_cr("### YOUNG LIST seems not well formed!");
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
247 gclog_or_tty->print_cr("### list has %u entries, _length is %u",
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
248 length, _length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
249 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
250
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
251 return ret;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
252 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
253
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
254 bool YoungList::check_list_empty(bool check_sample) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
255 bool ret = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
256
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
257 if (_length != 0) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
258 gclog_or_tty->print_cr("### YOUNG LIST should have 0 length, not %u",
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
259 _length);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
260 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
261 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
262 if (check_sample && _last_sampled_rs_lengths != 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
263 gclog_or_tty->print_cr("### YOUNG LIST has non-zero last sampled RS lengths");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
264 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
265 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
266 if (_head != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
267 gclog_or_tty->print_cr("### YOUNG LIST does not have a NULL head");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
268 ret = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
269 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
270 if (!ret) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
271 gclog_or_tty->print_cr("### YOUNG LIST does not seem empty");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
272 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
273
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
274 return ret;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
275 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
276
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
277 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
278 YoungList::rs_length_sampling_init() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
279 _sampled_rs_lengths = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
280 _curr = _head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
281 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
282
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
283 bool
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
284 YoungList::rs_length_sampling_more() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
285 return _curr != NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
286 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
287
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
288 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
289 YoungList::rs_length_sampling_next() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
290 assert( _curr != NULL, "invariant" );
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
291 size_t rs_length = _curr->rem_set()->occupied();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
292
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
293 _sampled_rs_lengths += rs_length;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
294
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
295 // The current region may not yet have been added to the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
296 // incremental collection set (it gets added when it is
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
297 // retired as the current allocation region).
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
298 if (_curr->in_collection_set()) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
299 // Update the collection set policy information for this region
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
300 _g1h->g1_policy()->update_incremental_cset_info(_curr, rs_length);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
301 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
302
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
303 _curr = _curr->get_next_young_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
304 if (_curr == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
305 _last_sampled_rs_lengths = _sampled_rs_lengths;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
306 // gclog_or_tty->print_cr("last sampled RS lengths = %d", _last_sampled_rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
307 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
308 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
309
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
310 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
311 YoungList::reset_auxilary_lists() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
312 guarantee( is_empty(), "young list should be empty" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
313 assert(check_list_well_formed(), "young list should be well formed");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
314
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
315 // Add survivor regions to SurvRateGroup.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
316 _g1h->g1_policy()->note_start_adding_survivor_regions();
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
317 _g1h->g1_policy()->finished_recalculating_age_indexes(true /* is_survivors */);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
318
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
319 int young_index_in_cset = 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
320 for (HeapRegion* curr = _survivor_head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
321 curr != NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
322 curr = curr->get_next_young_region()) {
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
323 _g1h->g1_policy()->set_region_survivor(curr, young_index_in_cset);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
324
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
325 // The region is a non-empty survivor so let's add it to
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
326 // the incremental collection set for the next evacuation
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
327 // pause.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
328 _g1h->g1_policy()->add_region_to_incremental_cset_rhs(curr);
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
329 young_index_in_cset += 1;
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
330 }
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
331 assert((uint) young_index_in_cset == _survivor_length, "post-condition");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
332 _g1h->g1_policy()->note_stop_adding_survivor_regions();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
333
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
334 _head = _survivor_head;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
335 _length = _survivor_length;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
336 if (_survivor_head != NULL) {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
337 assert(_survivor_tail != NULL, "cause it shouldn't be");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
338 assert(_survivor_length > 0, "invariant");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
339 _survivor_tail->set_next_young_region(NULL);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
340 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
341
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
342 // Don't clear the survivor list handles until the start of
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
343 // the next evacuation pause - we need it in order to re-tag
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
344 // the survivor regions from this evacuation pause as 'young'
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
345 // at the start of the next.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
346
545
58054a18d735 6484959: G1: introduce survivor spaces
apetrusenko
parents: 526
diff changeset
347 _g1h->g1_policy()->finished_recalculating_age_indexes(false /* is_survivors */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
348
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
349 assert(check_list_well_formed(), "young list should be well formed");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
350 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
351
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
352 void YoungList::print() {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
353 HeapRegion* lists[] = {_head, _survivor_head};
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
354 const char* names[] = {"YOUNG", "SURVIVOR"};
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
355
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
356 for (uint list = 0; list < ARRAY_SIZE(lists); ++list) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
357 gclog_or_tty->print_cr("%s LIST CONTENTS", names[list]);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
358 HeapRegion *curr = lists[list];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
359 if (curr == NULL)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
360 gclog_or_tty->print_cr(" empty");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
361 while (curr != NULL) {
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
362 gclog_or_tty->print_cr(" "HR_FORMAT", P: "PTR_FORMAT ", N: "PTR_FORMAT", age: %4d",
6027
8a2e5a6a19a4 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 6011
diff changeset
363 HR_FORMAT_PARAMS(curr),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
364 curr->prev_top_at_mark_start(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
365 curr->next_top_at_mark_start(),
6027
8a2e5a6a19a4 7143490: G1: Remove HeapRegion::_top_at_conc_mark_count
johnc
parents: 6011
diff changeset
366 curr->age_in_surv_rate_group_cond());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
367 curr = curr->get_next_young_region();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
368 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
369 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
370
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
371 gclog_or_tty->cr();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
372 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
373
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
374 void G1RegionMappingChangedListener::reset_from_card_cache(uint start_idx, size_t num_regions) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
375 OtherRegionsTable::invalidate(start_idx, num_regions);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
376 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
377
20543
e7d0505c8a30 8059758: Footprint regressions with JDK-8038423
tschatzl
parents: 20522
diff changeset
378 void G1RegionMappingChangedListener::on_commit(uint start_idx, size_t num_regions, bool zero_filled) {
e7d0505c8a30 8059758: Footprint regressions with JDK-8038423
tschatzl
parents: 20522
diff changeset
379 // The from card cache is not the memory that is actually committed. So we cannot
e7d0505c8a30 8059758: Footprint regressions with JDK-8038423
tschatzl
parents: 20522
diff changeset
380 // take advantage of the zero_filled parameter.
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
381 reset_from_card_cache(start_idx, num_regions);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
382 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
383
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
384 void G1CollectedHeap::push_dirty_cards_region(HeapRegion* hr)
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
385 {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
386 // Claim the right to put the region on the dirty cards region list
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
387 // by installing a self pointer.
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
388 HeapRegion* next = hr->get_next_dirty_cards_region();
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
389 if (next == NULL) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
390 HeapRegion* res = (HeapRegion*)
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
391 Atomic::cmpxchg_ptr(hr, hr->next_dirty_cards_region_addr(),
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
392 NULL);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
393 if (res == NULL) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
394 HeapRegion* head;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
395 do {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
396 // Put the region to the dirty cards region list.
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
397 head = _dirty_cards_region_list;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
398 next = (HeapRegion*)
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
399 Atomic::cmpxchg_ptr(hr, &_dirty_cards_region_list, head);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
400 if (next == head) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
401 assert(hr->get_next_dirty_cards_region() == hr,
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
402 "hr->get_next_dirty_cards_region() != hr");
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
403 if (next == NULL) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
404 // The last region in the list points to itself.
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
405 hr->set_next_dirty_cards_region(hr);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
406 } else {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
407 hr->set_next_dirty_cards_region(next);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
408 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
409 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
410 } while (next != head);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
411 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
412 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
413 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
414
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
415 HeapRegion* G1CollectedHeap::pop_dirty_cards_region()
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
416 {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
417 HeapRegion* head;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
418 HeapRegion* hr;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
419 do {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
420 head = _dirty_cards_region_list;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
421 if (head == NULL) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
422 return NULL;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
423 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
424 HeapRegion* new_head = head->get_next_dirty_cards_region();
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
425 if (head == new_head) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
426 // The last region.
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
427 new_head = NULL;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
428 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
429 hr = (HeapRegion*)Atomic::cmpxchg_ptr(new_head, &_dirty_cards_region_list,
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
430 head);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
431 } while (hr != head);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
432 assert(hr != NULL, "invariant");
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
433 hr->set_next_dirty_cards_region(NULL);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
434 return hr;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
435 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
436
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
437 #ifdef ASSERT
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
438 // A region is added to the collection set as it is retired
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
439 // so an address p can point to a region which will be in the
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
440 // collection set but has not yet been retired. This method
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
441 // therefore is only accurate during a GC pause after all
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
442 // regions have been retired. It is used for debugging
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
443 // to check if an nmethod has references to objects that can
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
444 // be move during a partial collection. Though it can be
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
445 // inaccurate, it is sufficient for G1 because the conservative
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
446 // implementation of is_scavengable() for G1 will indicate that
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
447 // all nmethods must be scanned during a partial collection.
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
448 bool G1CollectedHeap::is_in_partial_collection(const void* p) {
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
449 if (p == NULL) {
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
450 return false;
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
451 }
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
452 return heap_region_containing(p)->in_collection_set();
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
453 }
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
454 #endif
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
455
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
456 // Returns true if the reference points to an object that
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
457 // can move in an incremental collection.
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
458 bool G1CollectedHeap::is_scavengable(const void* p) {
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
459 HeapRegion* hr = heap_region_containing(p);
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
460 return !hr->isHumongous();
3377
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
461 }
2aa9ddbb9e60 7041789: 30% perf regression with c2/arm following 7017732
jmasa
parents: 3356
diff changeset
462
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
463 void G1CollectedHeap::check_ct_logs_at_safepoint() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
464 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
465 CardTableModRefBS* ct_bs = g1_barrier_set();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
466
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
467 // Count the dirty cards at the start.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
468 CountNonCleanMemRegionClosure count1(this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
469 ct_bs->mod_card_iterate(&count1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
470 int orig_count = count1.n();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
471
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
472 // First clear the logged cards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
473 ClearLoggedCardTableEntryClosure clear;
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
474 dcqs.apply_closure_to_all_completed_buffers(&clear);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
475 dcqs.iterate_closure_all_threads(&clear, false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
476 clear.print_histo();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
477
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
478 // Now ensure that there's no dirty cards.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
479 CountNonCleanMemRegionClosure count2(this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
480 ct_bs->mod_card_iterate(&count2);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
481 if (count2.n() != 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
482 gclog_or_tty->print_cr("Card table has %d entries; %d originally",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
483 count2.n(), orig_count);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
484 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
485 guarantee(count2.n() == 0, "Card table should be clean.");
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 RedirtyLoggedCardTableEntryClosure redirty;
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
488 dcqs.apply_closure_to_all_completed_buffers(&redirty);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
489 dcqs.iterate_closure_all_threads(&redirty, false);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
490 gclog_or_tty->print_cr("Log entries = %d, dirty cards = %d.",
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
491 clear.num_processed(), orig_count);
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
492 guarantee(redirty.num_processed() == clear.num_processed(),
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
493 err_msg("Redirtied "SIZE_FORMAT" cards, bug cleared "SIZE_FORMAT,
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
494 redirty.num_processed(), clear.num_processed()));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
495
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
496 CountNonCleanMemRegionClosure count3(this);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
497 ct_bs->mod_card_iterate(&count3);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
498 if (count3.n() != orig_count) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
499 gclog_or_tty->print_cr("Should have restored them all: orig = %d, final = %d.",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
500 orig_count, count3.n());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
501 guarantee(count3.n() >= orig_count, "Should have restored them all.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
502 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
503 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
504
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
505 // Private class members.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
506
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
507 G1CollectedHeap* G1CollectedHeap::_g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
508
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
509 // Private methods.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
510
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
511 HeapRegion*
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
512 G1CollectedHeap::new_region_try_secondary_free_list(bool is_old) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
513 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
514 while (!_secondary_free_list.is_empty() || free_regions_coming()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
515 if (!_secondary_free_list.is_empty()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
516 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
517 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
518 "secondary_free_list has %u entries",
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
519 _secondary_free_list.length());
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
520 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
521 // It looks as if there are free regions available on the
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
522 // secondary_free_list. Let's move them to the free_list and try
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
523 // again to allocate from it.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
524 append_secondary_free_list();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
525
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
526 assert(_hrm.num_free_regions() > 0, "if the secondary_free_list was not "
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
527 "empty we should have moved at least one entry to the free_list");
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
528 HeapRegion* res = _hrm.allocate_free_region(is_old);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
529 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
530 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
531 "allocated "HR_FORMAT" from secondary_free_list",
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
532 HR_FORMAT_PARAMS(res));
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
533 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
534 return res;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
535 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
536
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
537 // Wait here until we get notified either when (a) there are no
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
538 // more free regions coming or (b) some regions have been moved on
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
539 // the secondary_free_list.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
540 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
541 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
542
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
543 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
544 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
545 "could not allocate from secondary_free_list");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
546 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
547 return NULL;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
548 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
549
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
550 HeapRegion* G1CollectedHeap::new_region(size_t word_size, bool is_old, bool do_expand) {
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3983
diff changeset
551 assert(!isHumongous(word_size) || word_size <= HeapRegion::GrainWords,
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
552 "the only time we use this to allocate a humongous region is "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
553 "when we are allocating a single humongous region");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
554
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
555 HeapRegion* res;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
556 if (G1StressConcRegionFreeing) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
557 if (!_secondary_free_list.is_empty()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
558 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
559 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
560 "forced to look at the secondary_free_list");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
561 }
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
562 res = new_region_try_secondary_free_list(is_old);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
563 if (res != NULL) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
564 return res;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
565 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
566 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
567 }
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
568
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
569 res = _hrm.allocate_free_region(is_old);
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
570
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
571 if (res == NULL) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
572 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
573 gclog_or_tty->print_cr("G1ConcRegionFreeing [region alloc] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
574 "res == NULL, trying the secondary_free_list");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
575 }
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
576 res = new_region_try_secondary_free_list(is_old);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
577 }
4781
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
578 if (res == NULL && do_expand && _expand_heap_after_alloc_failure) {
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
579 // Currently, only attempts to allocate GC alloc regions set
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
580 // do_expand to true. So, we should only reach here during a
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
581 // safepoint. If this assumption changes we might have to
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
582 // reconsider the use of _expand_heap_after_alloc_failure.
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
583 assert(SafepointSynchronize::is_at_safepoint(), "invariant");
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
584
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
585 ergo_verbose1(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
586 "attempt heap expansion",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
587 ergo_format_reason("region allocation request failed")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
588 ergo_format_byte("allocation request"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
589 word_size * HeapWordSize);
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
590 if (expand(word_size * HeapWordSize)) {
4781
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
591 // Given that expand() succeeded in expanding the heap, and we
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
592 // always expand the heap by an amount aligned to the heap
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
593 // region size, the free list should in theory not be empty.
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
594 // In either case allocate_free_region() will check for NULL.
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
595 res = _hrm.allocate_free_region(is_old);
4781
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
596 } else {
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
597 _expand_heap_after_alloc_failure = false;
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
598 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
599 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
600 return res;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
601 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
602
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
603 HeapWord*
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
604 G1CollectedHeap::humongous_obj_allocate_initialize_regions(uint first,
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
605 uint num_regions,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
606 size_t word_size,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
607 AllocationContext_t context) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
608 assert(first != G1_NO_HRM_INDEX, "pre-condition");
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
609 assert(isHumongous(word_size), "word_size should be humongous");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
610 assert(num_regions * HeapRegion::GrainWords >= word_size, "pre-condition");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
611
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
612 // Index of last region in the series + 1.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
613 uint last = first + num_regions;
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
614
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
615 // We need to initialize the region(s) we just discovered. This is
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
616 // a bit tricky given that it can happen concurrently with
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
617 // refinement threads refining cards on these regions and
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
618 // potentially wanting to refine the BOT as they are scanning
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
619 // those cards (this can happen shortly after a cleanup; see CR
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
620 // 6991377). So we have to set up the region(s) carefully and in
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
621 // a specific order.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
622
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
623 // The word size sum of all the regions we will allocate.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
624 size_t word_size_sum = (size_t) num_regions * HeapRegion::GrainWords;
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
625 assert(word_size <= word_size_sum, "sanity");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
626
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
627 // This will be the "starts humongous" region.
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
628 HeapRegion* first_hr = region_at(first);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
629 // The header of the new object will be placed at the bottom of
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
630 // the first region.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
631 HeapWord* new_obj = first_hr->bottom();
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
632 // This will be the new end of the first region in the series that
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
633 // should also match the end of the last region in the series.
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
634 HeapWord* new_end = new_obj + word_size_sum;
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
635 // This will be the new top of the first region that will reflect
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
636 // this allocation.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
637 HeapWord* new_top = new_obj + word_size;
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
638
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
639 // First, we need to zero the header of the space that we will be
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
640 // allocating. When we update top further down, some refinement
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
641 // threads might try to scan the region. By zeroing the header we
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
642 // ensure that any thread that will try to scan the region will
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
643 // come across the zero klass word and bail out.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
644 //
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
645 // NOTE: It would not have been correct to have used
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
646 // CollectedHeap::fill_with_object() and make the space look like
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
647 // an int array. The thread that is doing the allocation will
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
648 // later update the object header to a potentially different array
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
649 // type and, for a very short period of time, the klass and length
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
650 // fields will be inconsistent. This could cause a refinement
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
651 // thread to calculate the object size incorrectly.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
652 Copy::fill_to_words(new_obj, oopDesc::header_size(), 0);
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
653
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
654 // We will set up the first region as "starts humongous". This
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
655 // will also update the BOT covering all the regions to reflect
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
656 // that there is a single object that starts at the bottom of the
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
657 // first region.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
658 first_hr->set_startsHumongous(new_top, new_end);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
659 first_hr->set_allocation_context(context);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
660 // Then, if there are any, we will set up the "continues
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
661 // humongous" regions.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
662 HeapRegion* hr = NULL;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
663 for (uint i = first + 1; i < last; ++i) {
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
664 hr = region_at(i);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
665 hr->set_continuesHumongous(first_hr);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
666 hr->set_allocation_context(context);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
667 }
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
668 // If we have "continues humongous" regions (hr != NULL), then the
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
669 // end of the last one should match new_end.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
670 assert(hr == NULL || hr->end() == new_end, "sanity");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
671
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
672 // Up to this point no concurrent thread would have been able to
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
673 // do any scanning on any region in this series. All the top
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
674 // fields still point to bottom, so the intersection between
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
675 // [bottom,top] and [card_start,card_end] will be empty. Before we
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
676 // update the top fields, we'll do a storestore to make sure that
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
677 // no thread sees the update to top before the zeroing of the
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
678 // object header and the BOT initialization.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
679 OrderAccess::storestore();
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
680
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
681 // Now that the BOT and the object header have been initialized,
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
682 // we can update top of the "starts humongous" region.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
683 assert(first_hr->bottom() < new_top && new_top <= first_hr->end(),
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
684 "new_top should be in this region");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
685 first_hr->set_top(new_top);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
686 if (_hr_printer.is_active()) {
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
687 HeapWord* bottom = first_hr->bottom();
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
688 HeapWord* end = first_hr->orig_end();
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
689 if ((first + 1) == last) {
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
690 // the series has a single humongous region
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
691 _hr_printer.alloc(G1HRPrinter::SingleHumongous, first_hr, new_top);
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
692 } else {
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
693 // the series has more than one humongous regions
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
694 _hr_printer.alloc(G1HRPrinter::StartsHumongous, first_hr, end);
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
695 }
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
696 }
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
697
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
698 // Now, we will update the top fields of the "continues humongous"
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
699 // regions. The reason we need to do this is that, otherwise,
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
700 // these regions would look empty and this will confuse parts of
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
701 // G1. For example, the code that looks for a consecutive number
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
702 // of empty regions will consider them empty and try to
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
703 // re-allocate them. We can extend is_empty() to also include
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
704 // !continuesHumongous(), but it is easier to just update the top
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
705 // fields here. The way we set top for all regions (i.e., top ==
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
706 // end for all regions but the last one, top == new_top for the
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
707 // last one) is actually used when we will free up the humongous
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
708 // region in free_humongous_region().
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
709 hr = NULL;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
710 for (uint i = first + 1; i < last; ++i) {
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
711 hr = region_at(i);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
712 if ((i + 1) == last) {
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
713 // last continues humongous region
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
714 assert(hr->bottom() < new_top && new_top <= hr->end(),
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
715 "new_top should fall on this region");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
716 hr->set_top(new_top);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
717 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, new_top);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
718 } else {
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
719 // not last one
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
720 assert(new_top > hr->end(), "new_top should be above this region");
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
721 hr->set_top(hr->end());
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
722 _hr_printer.alloc(G1HRPrinter::ContinuesHumongous, hr, hr->end());
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
723 }
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
724 }
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
725 // If we have continues humongous regions (hr != NULL), then the
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
726 // end of the last one should match new_end and its top should
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
727 // match new_top.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
728 assert(hr == NULL ||
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
729 (hr->end() == new_end && hr->top() == new_top), "sanity");
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
730 check_bitmaps("Humongous Region Allocation", first_hr);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
731
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
732 assert(first_hr->used() == word_size * HeapWordSize, "invariant");
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
733 _allocator->increase_used(first_hr->used());
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
734 _humongous_set.add(first_hr);
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
735
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
736 return new_obj;
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
737 }
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
738
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
739 // If could fit into free regions w/o expansion, try.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
740 // Otherwise, if can expand, do so.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
741 // Otherwise, if using ex regions might help, try with ex given back.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
742 HeapWord* G1CollectedHeap::humongous_obj_allocate(size_t word_size, AllocationContext_t context) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
743 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
744
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
745 verify_region_sets_optional();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
746
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
747 uint first = G1_NO_HRM_INDEX;
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
748 uint obj_regions = (uint)(align_size_up_(word_size, HeapRegion::GrainWords) / HeapRegion::GrainWords);
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
749
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
750 if (obj_regions == 1) {
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
751 // Only one region to allocate, try to use a fast path by directly allocating
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
752 // from the free lists. Do not try to expand here, we will potentially do that
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
753 // later.
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
754 HeapRegion* hr = new_region(word_size, true /* is_old */, false /* do_expand */);
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
755 if (hr != NULL) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
756 first = hr->hrm_index();
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
757 }
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
758 } else {
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
759 // We can't allocate humongous regions spanning more than one region while
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
760 // cleanupComplete() is running, since some of the regions we find to be
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
761 // empty might not yet be added to the free list. It is not straightforward
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
762 // to know in which list they are on so that we can remove them. We only
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
763 // need to do this if we need to allocate more than one region to satisfy the
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
764 // current humongous allocation request. If we are only allocating one region
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
765 // we use the one-region region allocation code (see above), that already
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
766 // potentially waits for regions from the secondary free list.
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
767 wait_while_free_regions_coming();
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
768 append_secondary_free_list_if_not_empty_with_lock();
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
769
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
770 // Policy: Try only empty regions (i.e. already committed first). Maybe we
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
771 // are lucky enough to find some.
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
772 first = _hrm.find_contiguous_only_empty(obj_regions);
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
773 if (first != G1_NO_HRM_INDEX) {
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
774 _hrm.allocate_free_regions_starting_at(first, obj_regions);
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
775 }
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
776 }
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
777
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
778 if (first == G1_NO_HRM_INDEX) {
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
779 // Policy: We could not find enough regions for the humongous object in the
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
780 // free list. Look through the heap to find a mix of free and uncommitted regions.
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
781 // If so, try expansion.
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
782 first = _hrm.find_contiguous_empty_or_unavailable(obj_regions);
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
783 if (first != G1_NO_HRM_INDEX) {
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
784 // We found something. Make sure these regions are committed, i.e. expand
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
785 // the heap. Alternatively we could do a defragmentation GC.
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
786 ergo_verbose1(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
787 "attempt heap expansion",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
788 ergo_format_reason("humongous allocation request failed")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
789 ergo_format_byte("allocation request"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
790 word_size * HeapWordSize);
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
791
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
792 _hrm.expand_at(first, obj_regions);
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
793 g1_policy()->record_new_heap_size(num_regions());
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
794
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
795 #ifdef ASSERT
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
796 for (uint i = first; i < first + obj_regions; ++i) {
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
797 HeapRegion* hr = region_at(i);
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
798 assert(hr->is_free(), "sanity");
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
799 assert(hr->is_empty(), "sanity");
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
800 assert(is_on_master_free_list(hr), "sanity");
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
801 }
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
802 #endif
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
803 _hrm.allocate_free_regions_starting_at(first, obj_regions);
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
804 } else {
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
805 // Policy: Potentially trigger a defragmentation GC.
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
806 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
807 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
808
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
809 HeapWord* result = NULL;
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
810 if (first != G1_NO_HRM_INDEX) {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
811 result = humongous_obj_allocate_initialize_regions(first, obj_regions,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
812 word_size, context);
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
813 assert(result != NULL, "it should always return a valid result");
3980
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
814
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
815 // A successful humongous object allocation changes the used space
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
816 // information of the old generation so we need to recalculate the
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
817 // sizes and update the jstat counters here.
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
818 g1mm()->update_sizes();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
819 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
820
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
821 verify_region_sets_optional();
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
822
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
823 return result;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
824 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
825
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
826 HeapWord* G1CollectedHeap::allocate_new_tlab(size_t word_size) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
827 assert_heap_not_locked_and_not_at_safepoint();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
828 assert(!isHumongous(word_size), "we do not allow humongous TLABs");
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
829
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
830 uint dummy_gc_count_before;
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
831 uint dummy_gclocker_retry_count = 0;
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
832 return attempt_allocation(word_size, &dummy_gc_count_before, &dummy_gclocker_retry_count);
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
835 HeapWord*
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
836 G1CollectedHeap::mem_allocate(size_t word_size,
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
837 bool* gc_overhead_limit_was_exceeded) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
838 assert_heap_not_locked_and_not_at_safepoint();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
839
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
840 // Loop until the allocation is satisfied, or unsatisfied after GC.
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
841 for (uint try_count = 1, gclocker_retry_count = 0; /* we'll return */; try_count += 1) {
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
842 uint gc_count_before;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
843
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
844 HeapWord* result = NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
845 if (!isHumongous(word_size)) {
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
846 result = attempt_allocation(word_size, &gc_count_before, &gclocker_retry_count);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
847 } else {
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
848 result = attempt_allocation_humongous(word_size, &gc_count_before, &gclocker_retry_count);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
849 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
850 if (result != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
851 return result;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
852 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
853
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
854 // Create the garbage collection operation...
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
855 VM_G1CollectForAllocation op(gc_count_before, word_size);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
856 op.set_allocation_context(AllocationContext::current());
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
857
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
858 // ...and get the VM thread to execute it.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
859 VMThread::execute(&op);
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
860
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
861 if (op.prologue_succeeded() && op.pause_succeeded()) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
862 // If the operation was successful we'll return the result even
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
863 // if it is NULL. If the allocation attempt failed immediately
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
864 // after a Full GC, it's unlikely we'll be able to allocate now.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
865 HeapWord* result = op.result();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
866 if (result != NULL && !isHumongous(word_size)) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
867 // Allocations that take place on VM operations do not do any
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
868 // card dirtying and we have to do it here. We only have to do
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
869 // this for non-humongous allocations, though.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
870 dirty_young_block(result, word_size);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
871 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
872 return result;
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
873 } else {
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
874 if (gclocker_retry_count > GCLockerRetryAllocationCount) {
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
875 return NULL;
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
876 }
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
877 assert(op.result() == NULL,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
878 "the result should be NULL if the VM op did not succeed");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
879 }
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 // Give a warning if we seem to be looping forever.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
882 if ((QueuedAllocationWarningCount > 0) &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
883 (try_count % QueuedAllocationWarningCount == 0)) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
884 warning("G1CollectedHeap::mem_allocate retries %d times", try_count);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
885 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
886 }
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
887
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
888 ShouldNotReachHere();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
889 return NULL;
342
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
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
892 HeapWord* G1CollectedHeap::attempt_allocation_slow(size_t word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
893 AllocationContext_t context,
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
894 uint* gc_count_before_ret,
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
895 uint* gclocker_retry_count_ret) {
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
896 // Make sure you read the note in attempt_allocation_humongous().
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
897
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
898 assert_heap_not_locked_and_not_at_safepoint();
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
899 assert(!isHumongous(word_size), "attempt_allocation_slow() should not "
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
900 "be called for humongous allocation requests");
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
901
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
902 // We should only get here after the first-level allocation attempt
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
903 // (attempt_allocation()) failed to allocate.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
904
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
905 // We will loop until a) we manage to successfully perform the
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
906 // allocation or b) we successfully schedule a collection which
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
907 // fails to perform the allocation. b) is the only case when we'll
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
908 // return NULL.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
909 HeapWord* result = NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
910 for (int try_count = 1; /* we'll return */; try_count += 1) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
911 bool should_try_gc;
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
912 uint gc_count_before;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
913
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
914 {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
915 MutexLockerEx x(Heap_lock);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
916 result = _allocator->mutator_alloc_region(context)->attempt_allocation_locked(word_size,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
917 false /* bot_updates */);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
918 if (result != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
919 return result;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
920 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
921
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
922 // If we reach here, attempt_allocation_locked() above failed to
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
923 // allocate a new region. So the mutator alloc region should be NULL.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
924 assert(_allocator->mutator_alloc_region(context)->get() == NULL, "only way to get here");
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
925
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
926 if (GC_locker::is_active_and_needs_gc()) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
927 if (g1_policy()->can_expand_young_list()) {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
928 // No need for an ergo verbose message here,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
929 // can_expand_young_list() does this when it returns true.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
930 result = _allocator->mutator_alloc_region(context)->attempt_allocation_force(word_size,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
931 false /* bot_updates */);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
932 if (result != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
933 return result;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
934 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
935 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
936 should_try_gc = false;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
937 } else {
6106
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
938 // The GCLocker may not be active but the GCLocker initiated
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
939 // GC may not yet have been performed (GCLocker::needs_gc()
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
940 // returns true). In this case we do not try this GC and
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
941 // wait until the GCLocker initiated GC is performed, and
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
942 // then retry the allocation.
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
943 if (GC_locker::needs_gc()) {
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
944 should_try_gc = false;
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
945 } else {
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
946 // Read the GC count while still holding the Heap_lock.
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
947 gc_count_before = total_collections();
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
948 should_try_gc = true;
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
949 }
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
950 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
951 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
952
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
953 if (should_try_gc) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
954 bool succeeded;
12113
f7d3b4387a16 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 12082
diff changeset
955 result = do_collection_pause(word_size, gc_count_before, &succeeded,
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
956 GCCause::_g1_inc_collection_pause);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
957 if (result != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
958 assert(succeeded, "only way to get back a non-NULL result");
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
959 return result;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
960 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
961
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
962 if (succeeded) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
963 // If we get here we successfully scheduled a collection which
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
964 // failed to allocate. No point in trying to allocate
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
965 // further. We'll just return NULL.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
966 MutexLockerEx x(Heap_lock);
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
967 *gc_count_before_ret = total_collections();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
968 return NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
969 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
970 } else {
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
971 if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) {
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
972 MutexLockerEx x(Heap_lock);
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
973 *gc_count_before_ret = total_collections();
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
974 return NULL;
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
975 }
6106
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
976 // The GCLocker is either active or the GCLocker initiated
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
977 // GC has not yet been performed. Stall until it is and
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
978 // then retry the allocation.
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
979 GC_locker::stall_until_clear();
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
980 (*gclocker_retry_count_ret) += 1;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
981 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
982
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
983 // We can reach here if we were unsuccessful in scheduling a
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
984 // collection (because another thread beat us to it) or if we were
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
985 // stalled due to the GC locker. In either can we should retry the
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
986 // allocation attempt in case another thread successfully
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
987 // performed a collection and reclaimed enough space. We do the
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
988 // first attempt (without holding the Heap_lock) here and the
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
989 // follow-on attempt will be at the start of the next loop
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
990 // iteration (after taking the Heap_lock).
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
991 result = _allocator->mutator_alloc_region(context)->attempt_allocation(word_size,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
992 false /* bot_updates */);
5963
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
993 if (result != NULL) {
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
994 return result;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
995 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
996
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
997 // Give a warning if we seem to be looping forever.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
998 if ((QueuedAllocationWarningCount > 0) &&
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
999 (try_count % QueuedAllocationWarningCount == 0)) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1000 warning("G1CollectedHeap::attempt_allocation_slow() "
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1001 "retries %d times", try_count);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1002 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1003 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1004
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1005 ShouldNotReachHere();
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1006 return NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1007 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1008
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1009 HeapWord* G1CollectedHeap::attempt_allocation_humongous(size_t word_size,
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
1010 uint* gc_count_before_ret,
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
1011 uint* gclocker_retry_count_ret) {
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1012 // The structure of this method has a lot of similarities to
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1013 // attempt_allocation_slow(). The reason these two were not merged
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1014 // into a single one is that such a method would require several "if
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1015 // allocation is not humongous do this, otherwise do that"
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1016 // conditional paths which would obscure its flow. In fact, an early
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1017 // version of this code did use a unified method which was harder to
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1018 // follow and, as a result, it had subtle bugs that were hard to
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1019 // track down. So keeping these two methods separate allows each to
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1020 // be more readable. It will be good to keep these two in sync as
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1021 // much as possible.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1022
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1023 assert_heap_not_locked_and_not_at_safepoint();
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1024 assert(isHumongous(word_size), "attempt_allocation_humongous() "
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1025 "should only be called for humongous allocations");
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1026
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1027 // Humongous objects can exhaust the heap quickly, so we should check if we
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1028 // need to start a marking cycle at each humongous object allocation. We do
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1029 // the check before we do the actual allocation. The reason for doing it
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1030 // before the allocation is that we avoid having to keep track of the newly
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1031 // allocated memory while we do a GC.
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
1032 if (g1_policy()->need_to_start_conc_mark("concurrent humongous allocation",
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
1033 word_size)) {
4834
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1034 collect(GCCause::_g1_humongous_allocation);
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1035 }
6a78aa6ac1ff 7132311: G1: assert((s == klass->oop_size(this)) || (Universe::heap()->is_gc_active() && ((is_typeArray()...
brutisso
parents: 4833
diff changeset
1036
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1037 // We will loop until a) we manage to successfully perform the
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1038 // allocation or b) we successfully schedule a collection which
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1039 // fails to perform the allocation. b) is the only case when we'll
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1040 // return NULL.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1041 HeapWord* result = NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1042 for (int try_count = 1; /* we'll return */; try_count += 1) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1043 bool should_try_gc;
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
1044 uint gc_count_before;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1045
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1046 {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1047 MutexLockerEx x(Heap_lock);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1048
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1049 // Given that humongous objects are not allocated in young
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1050 // regions, we'll first try to do the allocation without doing a
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1051 // collection hoping that there's enough space in the heap.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1052 result = humongous_obj_allocate(word_size, AllocationContext::current());
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1053 if (result != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1054 return result;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1055 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1056
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1057 if (GC_locker::is_active_and_needs_gc()) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1058 should_try_gc = false;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1059 } else {
6106
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1060 // The GCLocker may not be active but the GCLocker initiated
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1061 // GC may not yet have been performed (GCLocker::needs_gc()
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1062 // returns true). In this case we do not try this GC and
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1063 // wait until the GCLocker initiated GC is performed, and
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1064 // then retry the allocation.
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1065 if (GC_locker::needs_gc()) {
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1066 should_try_gc = false;
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1067 } else {
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1068 // Read the GC count while still holding the Heap_lock.
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1069 gc_count_before = total_collections();
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1070 should_try_gc = true;
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1071 }
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1072 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1073 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1074
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1075 if (should_try_gc) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1076 // If we failed to allocate the humongous object, we should try to
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1077 // do a collection pause (if we're allowed) in case it reclaims
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1078 // enough space for the allocation to succeed after the pause.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1079
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1080 bool succeeded;
12113
f7d3b4387a16 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 12082
diff changeset
1081 result = do_collection_pause(word_size, gc_count_before, &succeeded,
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
1082 GCCause::_g1_humongous_allocation);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1083 if (result != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1084 assert(succeeded, "only way to get back a non-NULL result");
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1085 return result;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1086 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1087
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1088 if (succeeded) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1089 // If we get here we successfully scheduled a collection which
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1090 // failed to allocate. No point in trying to allocate
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1091 // further. We'll just return NULL.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1092 MutexLockerEx x(Heap_lock);
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
1093 *gc_count_before_ret = total_collections();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1094 return NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1095 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1096 } else {
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
1097 if (*gclocker_retry_count_ret > GCLockerRetryAllocationCount) {
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
1098 MutexLockerEx x(Heap_lock);
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
1099 *gc_count_before_ret = total_collections();
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
1100 return NULL;
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
1101 }
6106
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1102 // The GCLocker is either active or the GCLocker initiated
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1103 // GC has not yet been performed. Stall until it is and
1d478c993020 7143858: G1: Back to back young GCs with the second GC having a minimally sized eden
johnc
parents: 6064
diff changeset
1104 // then retry the allocation.
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1105 GC_locker::stall_until_clear();
8853
2e093b564241 7014552: gc/lock/jni/jnilockXXX works too slow on 1-processor machine
mgerdin
parents: 8038
diff changeset
1106 (*gclocker_retry_count_ret) += 1;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1107 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1108
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1109 // We can reach here if we were unsuccessful in scheduling a
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1110 // collection (because another thread beat us to it) or if we were
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1111 // stalled due to the GC locker. In either can we should retry the
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1112 // allocation attempt in case another thread successfully
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1113 // performed a collection and reclaimed enough space. Give a
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1114 // warning if we seem to be looping forever.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1115
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1116 if ((QueuedAllocationWarningCount > 0) &&
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1117 (try_count % QueuedAllocationWarningCount == 0)) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1118 warning("G1CollectedHeap::attempt_allocation_humongous() "
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1119 "retries %d times", try_count);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1120 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1121 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1122
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1123 ShouldNotReachHere();
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1124 return NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1125 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1126
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1127 HeapWord* G1CollectedHeap::attempt_allocation_at_safepoint(size_t word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1128 AllocationContext_t context,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1129 bool expect_null_mutator_alloc_region) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1130 assert_at_safepoint(true /* should_be_vm_thread */);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1131 assert(_allocator->mutator_alloc_region(context)->get() == NULL ||
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1132 !expect_null_mutator_alloc_region,
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1133 "the current alloc region was unexpectedly found to be non-NULL");
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1134
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1135 if (!isHumongous(word_size)) {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1136 return _allocator->mutator_alloc_region(context)->attempt_allocation_locked(word_size,
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1137 false /* bot_updates */);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1138 } else {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1139 HeapWord* result = humongous_obj_allocate(word_size, context);
4829
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
1140 if (result != NULL && g1_policy()->need_to_start_conc_mark("STW humongous allocation")) {
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
1141 g1_policy()->set_initiate_conc_mark_if_possible();
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
1142 }
9509c20bba28 6976060: G1: humongous object allocations should initiate marking cycles when necessary
brutisso
parents: 4787
diff changeset
1143 return result;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1144 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1145
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1146 ShouldNotReachHere();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1147 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1148
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1149 class PostMCRemSetClearClosure: public HeapRegionClosure {
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1150 G1CollectedHeap* _g1h;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1151 ModRefBarrierSet* _mr_bs;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1152 public:
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1153 PostMCRemSetClearClosure(G1CollectedHeap* g1h, ModRefBarrierSet* mr_bs) :
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1154 _g1h(g1h), _mr_bs(mr_bs) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1155
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1156 bool doHeapRegion(HeapRegion* r) {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1157 HeapRegionRemSet* hrrs = r->rem_set();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1158
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1159 if (r->continuesHumongous()) {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1160 // We'll assert that the strong code root list and RSet is empty
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1161 assert(hrrs->strong_code_roots_list_length() == 0, "sanity");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1162 assert(hrrs->occupied() == 0, "RSet should be empty");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1163 return false;
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1164 }
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1165
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1166 _g1h->reset_gc_time_stamps(r);
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1167 hrrs->clear();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1168 // You might think here that we could clear just the cards
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1169 // corresponding to the used region. But no: if we leave a dirty card
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1170 // in a region we might allocate into, then it would prevent that card
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1171 // from being enqueued, and cause it to be missed.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1172 // Re: the performance cost: we shouldn't be doing full GC anyway!
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1173 _mr_bs->clear(MemRegion(r->bottom(), r->end()));
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1174
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1175 return false;
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 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1178
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1179 void G1CollectedHeap::clear_rsets_post_compaction() {
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
1180 PostMCRemSetClearClosure rs_clear(this, g1_barrier_set());
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1181 heap_region_iterate(&rs_clear);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1182 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1183
626
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1184 class RebuildRSOutOfRegionClosure: public HeapRegionClosure {
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1185 G1CollectedHeap* _g1h;
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1186 UpdateRSOopClosure _cl;
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1187 int _worker_i;
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1188 public:
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1189 RebuildRSOutOfRegionClosure(G1CollectedHeap* g1, int worker_i = 0) :
1861
c32059ef4dc0 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 1840
diff changeset
1190 _cl(g1->g1_rem_set(), worker_i),
626
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1191 _worker_i(worker_i),
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1192 _g1h(g1)
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1193 { }
1960
878b57474103 6978187: G1: assert(ParallelGCThreads> 1 || n_yielded() == _hrrs->occupied()) strikes again
johnc
parents: 1883
diff changeset
1194
626
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1195 bool doHeapRegion(HeapRegion* r) {
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1196 if (!r->continuesHumongous()) {
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1197 _cl.set_from(r);
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1198 r->oop_iterate(&_cl);
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1199 }
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1200 return false;
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1201 }
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1202 };
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1203
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1204 class ParRebuildRSTask: public AbstractGangTask {
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1205 G1CollectedHeap* _g1;
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1206 public:
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1207 ParRebuildRSTask(G1CollectedHeap* g1)
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1208 : AbstractGangTask("ParRebuildRSTask"),
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1209 _g1(g1)
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1210 { }
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1211
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
1212 void work(uint worker_id) {
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
1213 RebuildRSOutOfRegionClosure rebuild_rs(_g1, worker_id);
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
1214 _g1->heap_region_par_iterate_chunked(&rebuild_rs, worker_id,
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
1215 _g1->workers()->active_workers(),
626
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1216 HeapRegion::RebuildRSClaimValue);
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1217 }
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1218 };
87fa6e083d82 6760309: G1: update remembered sets during Full GCs
apetrusenko
parents: 620
diff changeset
1219
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1220 class PostCompactionPrinterClosure: public HeapRegionClosure {
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1221 private:
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1222 G1HRPrinter* _hr_printer;
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1223 public:
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1224 bool doHeapRegion(HeapRegion* hr) {
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1225 assert(!hr->is_young(), "not expecting to find young regions");
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1226 if (hr->is_free()) {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1227 // We only generate output for non-empty regions.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1228 } else if (hr->startsHumongous()) {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1229 if (hr->region_num() == 1) {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1230 // single humongous region
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1231 _hr_printer->post_compaction(hr, G1HRPrinter::SingleHumongous);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1232 } else {
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1233 _hr_printer->post_compaction(hr, G1HRPrinter::StartsHumongous);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1234 }
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1235 } else if (hr->continuesHumongous()) {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1236 _hr_printer->post_compaction(hr, G1HRPrinter::ContinuesHumongous);
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1237 } else if (hr->is_old()) {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1238 _hr_printer->post_compaction(hr, G1HRPrinter::Old);
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1239 } else {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
1240 ShouldNotReachHere();
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1241 }
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1242 return false;
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1243 }
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1244
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1245 PostCompactionPrinterClosure(G1HRPrinter* hr_printer)
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1246 : _hr_printer(hr_printer) { }
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1247 };
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1248
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1249 void G1CollectedHeap::print_hrm_post_compaction() {
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1250 PostCompactionPrinterClosure cl(hr_printer());
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1251 heap_region_iterate(&cl);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1252 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
1253
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1254 bool G1CollectedHeap::do_collection(bool explicit_gc,
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
1255 bool clear_all_soft_refs,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1256 size_t word_size) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1257 assert_at_safepoint(true /* should_be_vm_thread */);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1258
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1313
diff changeset
1259 if (GC_locker::check_active_before_gc()) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1260 return false;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1313
diff changeset
1261 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1313
diff changeset
1262
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1263 STWGCTimer* gc_timer = G1MarkSweep::gc_timer();
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13062
diff changeset
1264 gc_timer->register_gc_start();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1265
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1266 SerialOldTracer* gc_tracer = G1MarkSweep::gc_tracer();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1267 gc_tracer->report_gc_start(gc_cause(), gc_timer->gc_start());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1268
2125
7246a374a9f2 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 2039
diff changeset
1269 SvcGCMarker sgcm(SvcGCMarker::FULL);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1270 ResourceMark rm;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1271
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4787
diff changeset
1272 print_heap_before_gc();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1273 trace_heap_before_gc(gc_tracer);
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
1274
17866
270d7cb38f40 8038934: Remove prefix allocated_ from methods and variables in Metaspace
ehelin
parents: 17844
diff changeset
1275 size_t metadata_prev_used = MetaspaceAux::used_bytes();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
1276
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1277 verify_region_sets_optional();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1278
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1279 const bool do_clear_all_soft_refs = clear_all_soft_refs ||
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1280 collector_policy()->should_clear_all_soft_refs();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1281
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1282 ClearedAllSoftRefs casr(do_clear_all_soft_refs, collector_policy());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1283
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1284 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1285 IsGCActiveMark x;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1286
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1287 // Timing
6030
48fac5d60c3c 7163848: G1: Log GC Cause for a GC
brutisso
parents: 6027
diff changeset
1288 assert(gc_cause() != GCCause::_java_lang_system_gc || explicit_gc, "invariant");
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5987
diff changeset
1289 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
6030
48fac5d60c3c 7163848: G1: Log GC Cause for a GC
brutisso
parents: 6027
diff changeset
1290
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1291 {
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17992
diff changeset
1292 GCTraceTime t(GCCauseString("Full GC", gc_cause()), G1Log::fine(), true, NULL, gc_tracer->gc_id());
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1293 TraceCollectorStats tcs(g1mm()->full_collection_counters());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1294 TraceMemoryManagerStats tms(true /* fullGC */, gc_cause());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1295
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1296 double start = os::elapsedTime();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1297 g1_policy()->record_full_collection_start();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1298
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1299 // Note: When we have a more flexible GC logging framework that
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1300 // allows us to add optional attributes to a GC log record we
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1301 // could consider timing and reporting how long we wait in the
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1302 // following two methods.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1303 wait_while_free_regions_coming();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1304 // If we start the compaction before the CM threads finish
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1305 // scanning the root regions we might trip them over as we'll
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1306 // be moving objects / updating references. So let's wait until
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1307 // they are done. By telling them to abort, they should complete
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1308 // early.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1309 _cm->root_regions()->abort();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1310 _cm->root_regions()->wait_until_scan_finished();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1311 append_secondary_free_list_if_not_empty_with_lock();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1312
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1313 gc_prologue(true);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1314 increment_total_collections(true /* full gc */);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1315 increment_old_marking_cycles_started();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1316
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1317 assert(used() == recalculate_used(), "Should be equal");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1318
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1319 verify_before_gc();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1320
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1321 check_bitmaps("Full GC Start");
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1322 pre_full_gc_dump(gc_timer);
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1323
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1324 COMPILER2_PRESENT(DerivedPointerTable::clear());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1325
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1326 // Disable discovery and empty the discovered lists
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1327 // for the CM ref processor.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1328 ref_processor_cm()->disable_discovery();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1329 ref_processor_cm()->abandon_partial_discovery();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1330 ref_processor_cm()->verify_no_references_recorded();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1331
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1332 // Abandon current iterations of concurrent marking and concurrent
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1333 // refinement, if any are in progress. We have to do this before
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1334 // wait_until_scan_finished() below.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1335 concurrent_mark()->abort();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1336
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1337 // Make sure we'll choose a new allocation region afterwards.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1338 _allocator->release_mutator_alloc_region();
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1339 _allocator->abandon_gc_alloc_regions();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1340 g1_rem_set()->cleanupHRRS();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1341
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1342 // We should call this after we retire any currently active alloc
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1343 // regions so that all the ALLOC / RETIRE events are generated
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1344 // before the start GC event.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1345 _hr_printer.start_gc(true /* full */, (size_t) total_collections());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1346
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1347 // We may have added regions to the current incremental collection
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1348 // set between the last GC or pause and now. We need to clear the
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1349 // incremental collection set and then start rebuilding it afresh
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1350 // after this full GC.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1351 abandon_collection_set(g1_policy()->inc_cset_head());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1352 g1_policy()->clear_incremental_cset();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1353 g1_policy()->stop_incremental_cset_building();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1354
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1355 tear_down_region_sets(false /* free_list_only */);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1356 g1_policy()->set_gcs_are_young(true);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1357
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1358 // See the comments in g1CollectedHeap.hpp and
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1359 // G1CollectedHeap::ref_processing_init() about
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1360 // how reference processing currently works in G1.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1361
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1362 // Temporarily make discovery by the STW ref processor single threaded (non-MT).
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1363 ReferenceProcessorMTDiscoveryMutator stw_rp_disc_ser(ref_processor_stw(), false);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1364
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1365 // Temporarily clear the STW ref processor's _is_alive_non_header field.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1366 ReferenceProcessorIsAliveMutator stw_rp_is_alive_null(ref_processor_stw(), NULL);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1367
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1368 ref_processor_stw()->enable_discovery(true /*verify_disabled*/, true /*verify_no_refs*/);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1369 ref_processor_stw()->setup_policy(do_clear_all_soft_refs);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1370
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1371 // Do collection work
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1372 {
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1373 HandleMark hm; // Discard invalid handles created during gc
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1374 G1MarkSweep::invoke_at_safepoint(ref_processor_stw(), do_clear_all_soft_refs);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1375 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1376
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1377 assert(num_free_regions() == 0, "we should not have added any free regions");
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1378 rebuild_region_sets(false /* free_list_only */);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1379
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1380 // Enqueue any discovered reference objects that have
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1381 // not been removed from the discovered lists.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1382 ref_processor_stw()->enqueue_discovered_references();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1383
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1384 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1385
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1386 MemoryService::track_memory_usage();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1387
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1388 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1389 ref_processor_stw()->verify_no_references_recorded();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1390
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1391 // Delete metaspaces for unloaded class loaders and clean up loader_data graph
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1392 ClassLoaderDataGraph::purge();
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1393 MetaspaceAux::verify_metrics();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1394
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1395 // Note: since we've just done a full GC, concurrent
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1396 // marking is no longer active. Therefore we need not
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1397 // re-enable reference discovery for the CM ref processor.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1398 // That will be done at the start of the next marking cycle.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1399 assert(!ref_processor_cm()->discovery_enabled(), "Postcondition");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1400 ref_processor_cm()->verify_no_references_recorded();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1401
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1402 reset_gc_time_stamp();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1403 // Since everything potentially moved, we will clear all remembered
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1404 // sets, and clear all cards. Later we will rebuild remembered
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1405 // sets. We will also reset the GC time stamps of the regions.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1406 clear_rsets_post_compaction();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1407 check_gc_time_stamps();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1408
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1409 // Resize the heap if necessary.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1410 resize_if_necessary_after_full_collection(explicit_gc ? 0 : word_size);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1411
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1412 if (_hr_printer.is_active()) {
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1413 // We should do this after we potentially resize the heap so
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1414 // that all the COMMIT / UNCOMMIT events are generated before
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1415 // the end GC event.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1416
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1417 print_hrm_post_compaction();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1418 _hr_printer.end_gc(true /* full */, (size_t) total_collections());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1419 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1420
10246
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
1421 G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
1422 if (hot_card_cache->use_cache()) {
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
1423 hot_card_cache->reset_card_counts();
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
1424 hot_card_cache->reset_hot_cache();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1425 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1426
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1427 // Rebuild remembered sets of all regions.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1428 if (G1CollectedHeap::use_parallel_gc_threads()) {
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1429 uint n_workers =
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1430 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1431 workers()->active_workers(),
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1432 Threads::number_of_non_daemon_threads());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1433 assert(UseDynamicNumberOfGCThreads ||
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1434 n_workers == workers()->total_workers(),
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1435 "If not dynamic should be using all the workers");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1436 workers()->set_active_workers(n_workers);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1437 // Set parallel threads in the heap (_n_par_threads) only
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1438 // before a parallel phase and always reset it to 0 after
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1439 // the phase so that the number of parallel threads does
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1440 // no get carried forward to a serial phase where there
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1441 // may be code that is "possibly_parallel".
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1442 set_par_threads(n_workers);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1443
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1444 ParRebuildRSTask rebuild_rs_task(this);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1445 assert(check_heap_region_claim_values(
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1446 HeapRegion::InitialClaimValue), "sanity check");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1447 assert(UseDynamicNumberOfGCThreads ||
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1448 workers()->active_workers() == workers()->total_workers(),
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1449 "Unless dynamic should use total workers");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1450 // Use the most recent number of active workers
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1451 assert(workers()->active_workers() > 0,
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1452 "Active workers not properly set");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1453 set_par_threads(workers()->active_workers());
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1454 workers()->run_task(&rebuild_rs_task);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1455 set_par_threads(0);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1456 assert(check_heap_region_claim_values(
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1457 HeapRegion::RebuildRSClaimValue), "sanity check");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1458 reset_heap_region_claim_values();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1459 } else {
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1460 RebuildRSOutOfRegionClosure rebuild_rs(this);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1461 heap_region_iterate(&rebuild_rs);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1462 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1463
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1464 // Rebuild the strong code root lists for each region
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1465 rebuild_strong_code_roots();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
1466
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1467 if (true) { // FIXME
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1468 MetaspaceGC::compute_new_size();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1469 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1470
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 545
diff changeset
1471 #ifdef TRACESPINNING
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1472 ParallelTaskTerminator::print_termination_counts();
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 545
diff changeset
1473 #endif
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 545
diff changeset
1474
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1475 // Discard all rset updates
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1476 JavaThread::dirty_card_queue_set().abandon_logs();
20504
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
1477 assert(dirty_card_queue_set().completed_buffers_num() == 0, "DCQS should be empty");
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1478
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1479 _young_list->reset_sampled_info();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1480 // At this point there should be no regions in the
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1481 // entire heap tagged as young.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1482 assert(check_young_list_empty(true /* check_heap */),
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1483 "young list should be empty at this point");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1484
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1485 // Update the number of full collections that have been completed.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1486 increment_old_marking_cycles_completed(false /* concurrent */);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1487
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1488 _hrm.verify_optional();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1489 verify_region_sets_optional();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1490
10373
3a4805ad0005 8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents: 10372
diff changeset
1491 verify_after_gc();
3a4805ad0005 8015244: G1: Verification after a full GC is incorrectly placed.
johnc
parents: 10372
diff changeset
1492
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1493 // Clear the previous marking bitmap, if needed for bitmap verification.
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1494 // Note we cannot do this when we clear the next marking bitmap in
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1495 // ConcurrentMark::abort() above since VerifyDuringGC verifies the
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1496 // objects marked during a full GC against the previous bitmap.
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1497 // But we need to clear it before calling check_bitmaps below since
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1498 // the full GC has compacted objects and updated TAMS but not updated
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1499 // the prev bitmap.
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1500 if (G1VerifyBitmaps) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1501 ((CMBitMap*) concurrent_mark()->prevMarkBitMap())->clearAll();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1502 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1503 check_bitmaps("Full GC End");
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
1504
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1505 // Start a new incremental collection set for the next pause
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1506 assert(g1_policy()->collection_set() == NULL, "must be");
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1507 g1_policy()->start_incremental_cset_building();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1508
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1509 clear_cset_fast_test();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1510
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1511 _allocator->init_mutator_alloc_region();
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1512
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1513 double end = os::elapsedTime();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1514 g1_policy()->record_full_collection_end();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1515
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1516 if (G1Log::fine()) {
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1517 g1_policy()->print_heap_transition();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1518 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1519
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1520 // We must call G1MonitoringSupport::update_sizes() in the same scoping level
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1521 // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1522 // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1523 // before any GC notifications are raised.
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1524 g1mm()->update_sizes();
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1525
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1526 gc_epilogue(true);
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1527 }
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1528
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1529 if (G1Log::finer()) {
10291
48391ab0687e 8010738: G1: Output for full GCs with +PrintGCDetails should contain perm gen size/meta data change info
johnc
parents: 10246
diff changeset
1530 g1_policy()->print_detailed_heap_transition(true /* full */);
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1531 }
6121
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
1532
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
1533 print_heap_after_gc();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1534 trace_heap_after_gc(gc_tracer);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1535
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1536 post_full_gc_dump(gc_timer);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1537
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13062
diff changeset
1538 gc_timer->register_gc_end();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1539 gc_tracer->report_gc_end(gc_timer->gc_end(), gc_timer->time_partitions());
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
1540 }
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1541
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1542 return true;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1543 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1544
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1545 void G1CollectedHeap::do_full_collection(bool clear_all_soft_refs) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1546 // do_collection() will return whether it succeeded in performing
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1547 // the GC. Currently, there is no facility on the
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1548 // do_full_collection() API to notify the caller than the collection
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1549 // did not succeed (e.g., because it was locked out by the GC
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1550 // locker). So, right now, we'll ignore the return value.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1551 bool dummy = do_collection(true, /* explicit_gc */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1552 clear_all_soft_refs,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1553 0 /* word_size */);
342
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
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1556 // This code is mostly copied from TenuredGeneration.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1557 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1558 G1CollectedHeap::
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1559 resize_if_necessary_after_full_collection(size_t word_size) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1560 // Include the current allocation, if any, and bytes that will be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1561 // pre-allocated to support collections, as "used".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1562 const size_t used_after_gc = used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1563 const size_t capacity_after_gc = capacity();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1564 const size_t free_after_gc = capacity_after_gc - used_after_gc;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1565
1717
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1566 // This is enforced in arguments.cpp.
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1567 assert(MinHeapFreeRatio <= MaxHeapFreeRatio,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1568 "otherwise the code below doesn't make sense");
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1569
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1570 // We don't have floating point command-line arguments
1717
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1571 const double minimum_free_percentage = (double) MinHeapFreeRatio / 100.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1572 const double maximum_used_percentage = 1.0 - minimum_free_percentage;
1717
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1573 const double maximum_free_percentage = (double) MaxHeapFreeRatio / 100.0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1574 const double minimum_used_percentage = 1.0 - maximum_free_percentage;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1575
1717
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1576 const size_t min_heap_size = collector_policy()->min_heap_byte_size();
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1577 const size_t max_heap_size = collector_policy()->max_heap_byte_size();
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1578
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1579 // We have to be careful here as these two calculations can overflow
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1580 // 32-bit size_t's.
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1581 double used_after_gc_d = (double) used_after_gc;
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1582 double minimum_desired_capacity_d = used_after_gc_d / maximum_used_percentage;
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1583 double maximum_desired_capacity_d = used_after_gc_d / minimum_used_percentage;
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1584
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1585 // Let's make sure that they are both under the max heap size, which
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1586 // by default will make them fit into a size_t.
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1587 double desired_capacity_upper_bound = (double) max_heap_size;
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1588 minimum_desired_capacity_d = MIN2(minimum_desired_capacity_d,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1589 desired_capacity_upper_bound);
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1590 maximum_desired_capacity_d = MIN2(maximum_desired_capacity_d,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1591 desired_capacity_upper_bound);
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1592
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1593 // We can now safely turn them into size_t's.
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1594 size_t minimum_desired_capacity = (size_t) minimum_desired_capacity_d;
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1595 size_t maximum_desired_capacity = (size_t) maximum_desired_capacity_d;
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1596
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1597 // This assert only makes sense here, before we adjust them
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1598 // with respect to the min and max heap size.
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1599 assert(minimum_desired_capacity <= maximum_desired_capacity,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1600 err_msg("minimum_desired_capacity = "SIZE_FORMAT", "
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1601 "maximum_desired_capacity = "SIZE_FORMAT,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1602 minimum_desired_capacity, maximum_desired_capacity));
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1603
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1604 // Should not be greater than the heap max size. No need to adjust
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1605 // it with respect to the heap min size as it's a lower bound (i.e.,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1606 // we'll try to make the capacity larger than it, not smaller).
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1607 minimum_desired_capacity = MIN2(minimum_desired_capacity, max_heap_size);
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1608 // Should not be less than the heap min size. No need to adjust it
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1609 // with respect to the heap max size as it's an upper bound (i.e.,
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1610 // we'll try to make the capacity smaller than it, not greater).
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1611 maximum_desired_capacity = MAX2(maximum_desired_capacity, min_heap_size);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1612
1717
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1613 if (capacity_after_gc < minimum_desired_capacity) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1614 // Don't expand unless it's significant
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1615 size_t expand_bytes = minimum_desired_capacity - capacity_after_gc;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1616 ergo_verbose4(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1617 "attempt heap expansion",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1618 ergo_format_reason("capacity lower than "
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1619 "min desired capacity after Full GC")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1620 ergo_format_byte("capacity")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1621 ergo_format_byte("occupancy")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1622 ergo_format_byte_perc("min desired capacity"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1623 capacity_after_gc, used_after_gc,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1624 minimum_desired_capacity, (double) MinHeapFreeRatio);
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1625 expand(expand_bytes);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1626
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1627 // No expansion, now see if we want to shrink
1717
688c3755d7af 6959014: G1: assert(minimum_desired_capacity <= maximum_desired_capacity) failed: sanity check
tonyp
parents: 1709
diff changeset
1628 } else if (capacity_after_gc > maximum_desired_capacity) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1629 // Capacity too large, compute shrinking size
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1630 size_t shrink_bytes = capacity_after_gc - maximum_desired_capacity;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1631 ergo_verbose4(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1632 "attempt heap shrinking",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1633 ergo_format_reason("capacity higher than "
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1634 "max desired capacity after Full GC")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1635 ergo_format_byte("capacity")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1636 ergo_format_byte("occupancy")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1637 ergo_format_byte_perc("max desired capacity"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1638 capacity_after_gc, used_after_gc,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1639 maximum_desired_capacity, (double) MaxHeapFreeRatio);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1640 shrink(shrink_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1641 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1642 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1643
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1644
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1645 HeapWord*
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1646 G1CollectedHeap::satisfy_failed_allocation(size_t word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1647 AllocationContext_t context,
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1648 bool* succeeded) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1649 assert_at_safepoint(true /* should_be_vm_thread */);
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1650
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1651 *succeeded = true;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1652 // Let's attempt the allocation first.
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1653 HeapWord* result =
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
1654 attempt_allocation_at_safepoint(word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1655 context,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1656 false /* expect_null_mutator_alloc_region */);
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1657 if (result != NULL) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1658 assert(*succeeded, "sanity");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1659 return result;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1660 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1661
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1662 // In a G1 heap, we're supposed to keep allocation from failing by
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1663 // incremental pauses. Therefore, at least for now, we'll favor
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1664 // expansion over collection. (This might change in the future if we can
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1665 // do something smarter than full collection to satisfy a failed alloc.)
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1666 result = expand_and_allocate(word_size, context);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1667 if (result != NULL) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1668 assert(*succeeded, "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1669 return result;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1670 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1671
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1672 // Expansion didn't work, we'll try to do a Full GC.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1673 bool gc_succeeded = do_collection(false, /* explicit_gc */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1674 false, /* clear_all_soft_refs */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1675 word_size);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1676 if (!gc_succeeded) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1677 *succeeded = false;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1678 return NULL;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1679 }
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1680
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1681 // Retry the allocation
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1682 result = attempt_allocation_at_safepoint(word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1683 context,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1684 true /* expect_null_mutator_alloc_region */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1685 if (result != NULL) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1686 assert(*succeeded, "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1687 return result;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1688 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1689
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1690 // Then, try a Full GC that will collect all soft references.
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1691 gc_succeeded = do_collection(false, /* explicit_gc */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1692 true, /* clear_all_soft_refs */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1693 word_size);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1694 if (!gc_succeeded) {
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1695 *succeeded = false;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1696 return NULL;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1697 }
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1698
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1699 // Retry the allocation once more
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1700 result = attempt_allocation_at_safepoint(word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1701 context,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1702 true /* expect_null_mutator_alloc_region */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1703 if (result != NULL) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1704 assert(*succeeded, "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1705 return result;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1706 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1707
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1708 assert(!collector_policy()->should_clear_all_soft_refs(),
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1709 "Flag should have been handled and cleared prior to this point");
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1360
diff changeset
1710
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1711 // What else? We might try synchronous finalization later. If the total
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1712 // space available is large enough for the allocation, then a more
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1713 // complete compaction phase than we've tried so far might be
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1714 // appropriate.
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1715 assert(*succeeded, "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1716 return NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1717 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1718
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1719 // Attempting to expand the heap sufficiently
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1720 // to support an allocation of the given "word_size". If
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1721 // successful, perform the allocation and return the address of the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1722 // allocated block, or else "NULL".
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1723
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1724 HeapWord* G1CollectedHeap::expand_and_allocate(size_t word_size, AllocationContext_t context) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1725 assert_at_safepoint(true /* should_be_vm_thread */);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1726
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1727 verify_region_sets_optional();
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
1728
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1729 size_t expand_bytes = MAX2(word_size * HeapWordSize, MinHeapDeltaBytes);
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1730 ergo_verbose1(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1731 "attempt heap expansion",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1732 ergo_format_reason("allocation request failed")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1733 ergo_format_byte("allocation request"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1734 word_size * HeapWordSize);
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1735 if (expand(expand_bytes)) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1736 _hrm.verify_optional();
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1737 verify_region_sets_optional();
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1738 return attempt_allocation_at_safepoint(word_size,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1739 context,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1740 false /* expect_null_mutator_alloc_region */);
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1741 }
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1742 return NULL;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1743 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1744
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1745 bool G1CollectedHeap::expand(size_t expand_bytes) {
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1746 size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1747 aligned_expand_bytes = align_size_up(aligned_expand_bytes,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1748 HeapRegion::GrainBytes);
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1749 ergo_verbose2(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1750 "expand the heap",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1751 ergo_format_byte("requested expansion amount")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1752 ergo_format_byte("attempted expansion amount"),
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1753 expand_bytes, aligned_expand_bytes);
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1754
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1755 if (is_maximal_no_gc()) {
12345
9de9169ddde6 8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents: 12343
diff changeset
1756 ergo_verbose0(ErgoHeapSizing,
9de9169ddde6 8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents: 12343
diff changeset
1757 "did not expand the heap",
9de9169ddde6 8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents: 12343
diff changeset
1758 ergo_format_reason("heap already fully expanded"));
9de9169ddde6 8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents: 12343
diff changeset
1759 return false;
9de9169ddde6 8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents: 12343
diff changeset
1760 }
9de9169ddde6 8025605: G1: Heap expansion logging misleading for fully expanded heap
brutisso
parents: 12343
diff changeset
1761
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1762 uint regions_to_expand = (uint)(aligned_expand_bytes / HeapRegion::GrainBytes);
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1763 assert(regions_to_expand > 0, "Must expand by at least one region");
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1764
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1765 uint expanded_by = _hrm.expand_by(regions_to_expand);
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1766
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1767 if (expanded_by > 0) {
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1768 size_t actual_expand_bytes = expanded_by * HeapRegion::GrainBytes;
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
1769 assert(actual_expand_bytes <= aligned_expand_bytes, "post-condition");
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1770 g1_policy()->record_new_heap_size(num_regions());
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1771 } else {
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1772 ergo_verbose0(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1773 "did not expand the heap",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1774 ergo_format_reason("heap expansion operation failed"));
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1775 // The expansion of the virtual storage space was unsuccessful.
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1776 // Let's see if it was because we ran out of swap.
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1777 if (G1ExitOnExpansionFailure &&
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1778 _hrm.available() >= regions_to_expand) {
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
1779 // We had head room...
10161
746b070f5022 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 10099
diff changeset
1780 vm_exit_out_of_memory(aligned_expand_bytes, OOM_MMAP_ERROR, "G1 heap expansion");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1781 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1782 }
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1783 return regions_to_expand > 0;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1784 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1785
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
1786 void G1CollectedHeap::shrink_helper(size_t shrink_bytes) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1787 size_t aligned_shrink_bytes =
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1788 ReservedSpace::page_align_size_down(shrink_bytes);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1789 aligned_shrink_bytes = align_size_down(aligned_shrink_bytes,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1790 HeapRegion::GrainBytes);
10242
b0d20fa374b4 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 10193
diff changeset
1791 uint num_regions_to_remove = (uint)(shrink_bytes / HeapRegion::GrainBytes);
b0d20fa374b4 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 10193
diff changeset
1792
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1793 uint num_regions_removed = _hrm.shrink_by(num_regions_to_remove);
10242
b0d20fa374b4 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 10193
diff changeset
1794 size_t shrunk_bytes = num_regions_removed * HeapRegion::GrainBytes;
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1795
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1796 ergo_verbose3(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1797 "shrink the heap",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1798 ergo_format_byte("requested shrinking amount")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1799 ergo_format_byte("aligned shrinking amount")
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1800 ergo_format_byte("attempted shrinking amount"),
10242
b0d20fa374b4 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 10193
diff changeset
1801 shrink_bytes, aligned_shrink_bytes, shrunk_bytes);
b0d20fa374b4 8013872: G1: HeapRegionSeq::shrink_by() has invalid assert
brutisso
parents: 10193
diff changeset
1802 if (num_regions_removed > 0) {
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1803 g1_policy()->record_new_heap_size(num_regions());
3914
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1804 } else {
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1805 ergo_verbose0(ErgoHeapSizing,
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1806 "did not shrink the heap",
20213c8a3c40 7050392: G1: Introduce flag to generate a log of the G1 ergonomic decisions
tonyp
parents: 3886
diff changeset
1807 ergo_format_reason("heap shrinking operation failed"));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1808 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1809 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1810
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1811 void G1CollectedHeap::shrink(size_t shrink_bytes) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1812 verify_region_sets_optional();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1813
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
1814 // We should only reach here at the end of a Full GC which means we
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
1815 // should not not be holding to any GC alloc regions. The method
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
1816 // below will make sure of that and do any remaining clean up.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1817 _allocator->abandon_gc_alloc_regions();
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
1818
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1819 // Instead of tearing down / rebuilding the free lists here, we
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1820 // could instead use the remove_all_pending() method on free_list to
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1821 // remove only the ones that we need to remove.
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
1822 tear_down_region_sets(true /* free_list_only */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1823 shrink_helper(shrink_bytes);
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
1824 rebuild_region_sets(true /* free_list_only */);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1825
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
1826 _hrm.verify_optional();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1827 verify_region_sets_optional();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1828 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1829
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1830 // Public methods.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1831
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1832 #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
1833 #pragma warning( disable:4355 ) // 'this' : used in base member initializer list
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1834 #endif // _MSC_VER
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1835
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1836
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1837 G1CollectedHeap::G1CollectedHeap(G1CollectorPolicy* policy_) :
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1838 SharedHeap(policy_),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1839 _g1_policy(policy_),
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1092
diff changeset
1840 _dirty_card_queue_set(false),
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
1841 _into_cset_dirty_card_queue_set(false),
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
1842 _is_alive_closure_cm(this),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
1843 _is_alive_closure_stw(this),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
1844 _ref_processor_cm(NULL),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
1845 _ref_processor_stw(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1846 _bot_shared(NULL),
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1847 _evac_failure_scan_stack(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1848 _mark_in_progress(false),
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1849 _cg1r(NULL),
3980
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
1850 _g1mm(NULL),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1851 _refine_cte_cl(NULL),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1852 _full_collection(false),
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
1853 _secondary_free_list("Secondary Free List", new SecondaryFreeRegionListMtSafeChecker()),
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
1854 _old_set("Old Set", false /* humongous */, new OldRegionSetMtSafeChecker()),
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
1855 _humongous_set("Master Humongous Set", true /* humongous */, new HumongousRegionSetMtSafeChecker()),
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
1856 _humongous_reclaim_candidates(),
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
1857 _has_humongous_reclaim_candidates(false),
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
1858 _free_regions_coming(false),
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1859 _young_list(new YoungList(this)),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1860 _gc_time_stamp(0),
6595
aaf61e68b255 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 6254
diff changeset
1861 _survivor_plab_stats(YoungPLABSize, PLABWeight),
aaf61e68b255 6818524: G1: use ergonomic resizing of PLABs
johnc
parents: 6254
diff changeset
1862 _old_plab_stats(OldPLABSize, PLABWeight),
4781
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
1863 _expand_heap_after_alloc_failure(true),
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 488
diff changeset
1864 _surviving_young_words(NULL),
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
1865 _old_marking_cycles_started(0),
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
1866 _old_marking_cycles_completed(0),
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1867 _concurrent_cycle_started(false),
22898
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
1868 _heap_summary_sent(false),
20212
d7e2d5f2846b 8027553: Change the in_cset_fast_test functionality to use the G1BiasedArray abstraction
tschatzl
parents: 20198
diff changeset
1869 _in_cset_fast_test(),
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
1870 _dirty_cards_region_list(NULL),
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
1871 _worker_cset_start_region(NULL),
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1872 _worker_cset_start_region_time_stamp(NULL),
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1873 _gc_timer_stw(new (ResourceObj::C_HEAP, mtGC) STWGCTimer()),
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1874 _gc_timer_cm(new (ResourceObj::C_HEAP, mtGC) ConcurrentGCTimer()),
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1875 _gc_tracer_stw(new (ResourceObj::C_HEAP, mtGC) G1NewTracer()),
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1876 _gc_tracer_cm(new (ResourceObj::C_HEAP, mtGC) G1OldTracer()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1877
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1878 _g1h = this;
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
1879
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
1880 _allocator = G1Allocator::create_allocator(_g1h);
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
1881 _humongous_object_threshold_in_words = HeapRegion::GrainWords / 2;
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
1882
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1883 int n_queues = MAX2((int)ParallelGCThreads, 1);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1884 _task_queues = new RefToScanQueueSet(n_queues);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1885
17758
ae7336d6337e 8034868: Extract G1 From Card Cache into separate class
tschatzl
parents: 17757
diff changeset
1886 uint n_rem_sets = HeapRegionRemSet::num_par_rem_sets();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1887 assert(n_rem_sets > 0, "Invariant.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1888
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6121
diff changeset
1889 _worker_cset_start_region = NEW_C_HEAP_ARRAY(HeapRegion*, n_queues, mtGC);
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
1890 _worker_cset_start_region_time_stamp = NEW_C_HEAP_ARRAY(uint, n_queues, mtGC);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1891 _evacuation_failed_info_array = NEW_C_HEAP_ARRAY(EvacuationFailedInfo, n_queues, mtGC);
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
1892
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1893 for (int i = 0; i < n_queues; i++) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1894 RefToScanQueue* q = new RefToScanQueue();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1895 q->initialize();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1896 _task_queues->register_queue(i, q);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1897 ::new (&_evacuation_failed_info_array[i]) EvacuationFailedInfo();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1898 }
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
1899 clear_cset_start_regions();
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
1900
6629
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
1901 // Initialize the G1EvacuationFailureALot counters and flags.
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
1902 NOT_PRODUCT(reset_evacuation_should_fail();)
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
1903
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1904 guarantee(_task_queues != NULL, "task_queues allocation failure.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1905 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1906
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1907 G1RegionToSpaceMapper* G1CollectedHeap::create_aux_memory_mapper(const char* description,
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1908 size_t size,
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1909 size_t translation_factor) {
22978
30e04eba9e29 8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents: 22977
diff changeset
1910 size_t preferred_page_size = os::page_size_for_region_unaligned(size, 1);
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1911 // Allocate a new reserved space, preferring to use large pages.
22978
30e04eba9e29 8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents: 22977
diff changeset
1912 ReservedSpace rs(size, preferred_page_size);
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1913 G1RegionToSpaceMapper* result =
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1914 G1RegionToSpaceMapper::create_mapper(rs,
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1915 size,
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1916 rs.alignment(),
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1917 HeapRegion::GrainBytes,
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1918 translation_factor,
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1919 mtGC);
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1920 if (TracePageSizes) {
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1921 gclog_or_tty->print_cr("G1 '%s': pg_sz=" SIZE_FORMAT " base=" PTR_FORMAT " size=" SIZE_FORMAT " alignment=" SIZE_FORMAT " reqsize=" SIZE_FORMAT,
22978
30e04eba9e29 8077255: TracePageSizes output reports wrong page size on Windows with G1
tschatzl
parents: 22977
diff changeset
1922 description, preferred_page_size, p2i(rs.base()), rs.size(), rs.alignment(), size);
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1923 }
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1924 return result;
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1925 }
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
1926
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1927 jint G1CollectedHeap::initialize() {
1166
7b0e9cba0307 6896647: card marks can be deferred too long
ysr
parents: 1111
diff changeset
1928 CollectedHeap::pre_initialize();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1929 os::enable_vtime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1930
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5987
diff changeset
1931 G1Log::init();
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5987
diff changeset
1932
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1933 // Necessary to satisfy locking discipline assertions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1934
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1935 MutexLocker x(Heap_lock);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1936
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1937 // We have to initialize the printer before committing the heap, as
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1938 // it will be used then.
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1939 _hr_printer.set_active(G1PrintHeapRegions);
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
1940
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1941 // While there are no constraints in the GC code that HeapWordSize
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1942 // be any particular value, there are multiple other areas in the
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1943 // system which believe this to be true (e.g. oop->object_size in some
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1944 // cases incorrectly returns the size in wordSize units rather than
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1945 // HeapWordSize).
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1946 guarantee(HeapWordSize == wordSize, "HeapWordSize must equal wordSize");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1947
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1948 size_t init_byte_size = collector_policy()->initial_heap_byte_size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1949 size_t max_byte_size = collector_policy()->max_heap_byte_size();
13060
8f07aa079343 8016309: assert(eden_size > 0 && survivor_size > 0) failed: just checking
jwilhelm
parents: 12840
diff changeset
1950 size_t heap_alignment = collector_policy()->heap_alignment();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1951
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1952 // Ensure that the sizes are properly aligned.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1953 Universe::check_alignment(init_byte_size, HeapRegion::GrainBytes, "g1 heap");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1954 Universe::check_alignment(max_byte_size, HeapRegion::GrainBytes, "g1 heap");
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12082
diff changeset
1955 Universe::check_alignment(max_byte_size, heap_alignment, "g1 heap");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1956
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
1957 _refine_cte_cl = new RefineCardTableEntryClosure();
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
1958
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
1959 _cg1r = new ConcurrentG1Refine(this, _refine_cte_cl);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1960
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1961 // Reserve the maximum.
642
660978a2a31a 6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents: 620
diff changeset
1962
3824
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1963 // When compressed oops are enabled, the preferred heap base
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1964 // is calculated by subtracting the requested size from the
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1965 // 32Gb boundary and using the result as the base address for
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1966 // heap reservation. If the requested size is not aligned to
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1967 // HeapRegion::GrainBytes (i.e. the alignment that is passed
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1968 // into the ReservedHeapSpace constructor) then the actual
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1969 // base of the reserved heap may end up differing from the
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1970 // address that was requested (i.e. the preferred heap base).
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1971 // If this happens then we could end up using a non-optimal
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1972 // compressed oops mode.
6aa4feb8a366 7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents: 3823
diff changeset
1973
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
1974 ReservedSpace heap_rs = Universe::reserve_heap(max_byte_size,
12110
4c84d351cca9 8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents: 12082
diff changeset
1975 heap_alignment);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1976
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1977 // It is important to do this in a way such that concurrent readers can't
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
1978 // temporarily think something is in the heap. (I've actually seen this
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1979 // happen in asserts: DLD.)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1980 _reserved.set_word_size(0);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1981 _reserved.set_start((HeapWord*)heap_rs.base());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1982 _reserved.set_end((HeapWord*)(heap_rs.base() + heap_rs.size()));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1983
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1984 // Create the gen rem set (and barrier set) for the entire reserved region.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1985 _rem_set = collector_policy()->create_rem_set(_reserved, 2);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1986 set_barrier_set(rem_set()->bs());
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
1987 if (!barrier_set()->is_a(BarrierSet::G1SATBCTLogging)) {
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
1988 vm_exit_during_initialization("G1 requires a G1SATBLoggingCardTableModRefBS");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1989 return JNI_ENOMEM;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1990 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1991
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1992 // Also create a G1 rem set.
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
1993 _g1_rem_set = new G1RemSet(this, g1_barrier_set());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1994
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1995 // Carve out the G1 part of the heap.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
1996
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
1997 ReservedSpace g1_rs = heap_rs.first_part(max_byte_size);
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
1998 G1RegionToSpaceMapper* heap_storage =
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
1999 G1RegionToSpaceMapper::create_mapper(g1_rs,
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2000 g1_rs.size(),
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2001 UseLargePages ? os::large_page_size() : os::vm_page_size(),
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2002 HeapRegion::GrainBytes,
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2003 1,
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2004 mtJavaHeap);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2005 heap_storage->set_mapping_changed_listener(&_listener);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2006
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2007 // Create storage for the BOT, card table, card counts table (hot card cache) and the bitmaps.
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2008 G1RegionToSpaceMapper* bot_storage =
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2009 create_aux_memory_mapper("Block offset table",
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2010 G1BlockOffsetSharedArray::compute_size(g1_rs.size() / HeapWordSize),
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2011 G1BlockOffsetSharedArray::N_bytes);
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2012
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2013 ReservedSpace cardtable_rs(G1SATBCardTableLoggingModRefBS::compute_size(g1_rs.size() / HeapWordSize));
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2014 G1RegionToSpaceMapper* cardtable_storage =
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2015 create_aux_memory_mapper("Card table",
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2016 G1SATBCardTableLoggingModRefBS::compute_size(g1_rs.size() / HeapWordSize),
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2017 G1BlockOffsetSharedArray::N_bytes);
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2018
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2019 G1RegionToSpaceMapper* card_counts_storage =
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2020 create_aux_memory_mapper("Card counts table",
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2021 G1BlockOffsetSharedArray::compute_size(g1_rs.size() / HeapWordSize),
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2022 G1BlockOffsetSharedArray::N_bytes);
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2023
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2024 size_t bitmap_size = CMBitMap::compute_size(g1_rs.size());
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2025 G1RegionToSpaceMapper* prev_bitmap_storage =
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2026 create_aux_memory_mapper("Prev Bitmap", bitmap_size, CMBitMap::mark_distance());
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2027 G1RegionToSpaceMapper* next_bitmap_storage =
22977
33e421924c67 8058354: SPECjvm2008-Derby -2.7% performance regression on Solaris-X64 starting with 9-b29
tschatzl
parents: 22936
diff changeset
2028 create_aux_memory_mapper("Next Bitmap", bitmap_size, CMBitMap::mark_distance());
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2029
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2030 _hrm.initialize(heap_storage, prev_bitmap_storage, next_bitmap_storage, bot_storage, cardtable_storage, card_counts_storage);
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2031 g1_barrier_set()->initialize(cardtable_storage);
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2032 // Do later initialization work for concurrent refinement.
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2033 _cg1r->init(card_counts_storage);
10246
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
2034
807
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
2035 // 6843694 - ensure that the maximum region index can fit
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
2036 // in the remembered set structures.
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2037 const uint max_region_idx = (1U << (sizeof(RegionIdx_t)*BitsPerByte-1)) - 1;
807
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
2038 guarantee((max_regions() - 1) <= max_region_idx, "too many regions");
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
2039
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
2040 size_t max_cards_per_region = ((size_t)1 << (sizeof(CardIdx_t)*BitsPerByte-1)) - 1;
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
2041 guarantee(HeapRegion::CardsPerRegion > 0, "make sure it's initialized");
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3983
diff changeset
2042 guarantee(HeapRegion::CardsPerRegion < max_cards_per_region,
942
2c79770d1f6e 6819085: G1: use larger and/or user settable region size
tonyp
parents: 941
diff changeset
2043 "too many cards per region");
807
d44bdab1c03d 6843694: G1: assert(index < _vs.committed_size(),"bad index"), g1BlockOffsetTable.inline.hpp:55
johnc
parents: 796
diff changeset
2044
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
2045 FreeRegionList::set_unrealistically_long_length(max_regions() + 1);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
2046
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2047 _bot_shared = new G1BlockOffsetSharedArray(_reserved, bot_storage);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2048
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2049 _g1h = this;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2050
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2051 {
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2052 HeapWord* start = _hrm.reserved().start();
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2053 HeapWord* end = _hrm.reserved().end();
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2054 size_t granularity = HeapRegion::GrainBytes;
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2055
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2056 _in_cset_fast_test.initialize(start, end, granularity);
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2057 _humongous_reclaim_candidates.initialize(start, end, granularity);
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
2058 }
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
2059
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2060 // Create the ConcurrentMark data structure and thread.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2061 // (Must do this late, so that "max_regions" is defined.)
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2062 _cm = new ConcurrentMark(this, prev_bitmap_storage, next_bitmap_storage);
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 7207
diff changeset
2063 if (_cm == NULL || !_cm->completed_initialization()) {
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 7207
diff changeset
2064 vm_shutdown_during_initialization("Could not create/initialize ConcurrentMark");
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 7207
diff changeset
2065 return JNI_ENOMEM;
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 7207
diff changeset
2066 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2067 _cmThread = _cm->cmThread();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2068
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2069 // Initialize the from_card cache structure of HeapRegionRemSet.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2070 HeapRegionRemSet::init_heap(max_regions());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2071
677
96b229c54d1e 6543938: G1: remove the concept of popularity
apetrusenko
parents: 647
diff changeset
2072 // Now expand into the initial heap size.
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
2073 if (!expand(init_byte_size)) {
7397
442f942757c0 8000244: G1: Ergonomically set MarkStackSize and use virtual space for global marking stack
johnc
parents: 7207
diff changeset
2074 vm_shutdown_during_initialization("Failed to allocate initial heap.");
2188
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
2075 return JNI_ENOMEM;
c33825b68624 6923430: G1: assert(res != 0,"This should have worked.")
johnc
parents: 2173
diff changeset
2076 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2077
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2078 // Perform any initialization actions delegated to the policy.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2079 g1_policy()->init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2080
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2081 JavaThread::satb_mark_queue_set().initialize(SATB_Q_CBL_mon,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2082 SATB_Q_FL_lock,
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1092
diff changeset
2083 G1SATBProcessCompletedThreshold,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2084 Shared_SATB_Q_lock);
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
2085
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
2086 JavaThread::dirty_card_queue_set().initialize(_refine_cte_cl,
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
2087 DirtyCardQ_CBL_mon,
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
2088 DirtyCardQ_FL_lock,
1111
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1092
diff changeset
2089 concurrent_g1_refine()->yellow_zone(),
44f61c24ddab 6862387: tune concurrent refinement further
iveresov
parents: 1092
diff changeset
2090 concurrent_g1_refine()->red_zone(),
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
2091 Shared_DirtyCardQ_lock);
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
2092
20504
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2093 dirty_card_queue_set().initialize(NULL, // Should never be called by the Java code
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2094 DirtyCardQ_CBL_mon,
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2095 DirtyCardQ_FL_lock,
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2096 -1, // never trigger processing
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2097 -1, // no limit on length
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2098 Shared_DirtyCardQ_lock,
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
2099 &JavaThread::dirty_card_queue_set());
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2100
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2101 // Initialize the card queue set used to hold cards containing
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2102 // references into the collection set.
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
2103 _into_cset_dirty_card_queue_set.initialize(NULL, // Should never be called by the Java code
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
2104 DirtyCardQ_CBL_mon,
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2105 DirtyCardQ_FL_lock,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2106 -1, // never trigger processing
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2107 -1, // no limit on length
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2108 Shared_DirtyCardQ_lock,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2109 &JavaThread::dirty_card_queue_set());
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2110
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2111 // In case we're keeping closure specialization stats, initialize those
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2112 // counts and that mechanism.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2113 SpecializationStats::clear();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2114
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2115 // Here we allocate the dummy HeapRegion that is required by the
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2116 // G1AllocRegion class.
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2117 HeapRegion* dummy_region = _hrm.get_dummy_region();
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2118
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2119 // We'll re-use the same region whether the alloc region will
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2120 // require BOT updates or not and, if it doesn't, then a non-young
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2121 // region will complain that it cannot support allocations without
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
2122 // BOT updates. So we'll tag the dummy region as eden to avoid that.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
2123 dummy_region->set_eden();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2124 // Make sure it's full.
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2125 dummy_region->set_top(dummy_region->end());
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2126 G1AllocRegion::setup(this, dummy_region);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2127
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2128 _allocator->init_mutator_alloc_region();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2129
3289
b52782ae3880 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 3285
diff changeset
2130 // Do create of the monitoring and management support so that
b52782ae3880 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 3285
diff changeset
2131 // values in the heap have been properly initialized.
3980
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
2132 _g1mm = new G1MonitoringSupport(this);
3289
b52782ae3880 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 3285
diff changeset
2133
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
2134 G1StringDedup::initialize();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
2135
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2136 return JNI_OK;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2137 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2138
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17937
diff changeset
2139 void G1CollectedHeap::stop() {
17992
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2140 // Stop all concurrent threads. We do this to make sure these threads
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2141 // do not continue to execute and access resources (e.g. gclog_or_tty)
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17937
diff changeset
2142 // that are destroyed during shutdown.
17992
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2143 _cg1r->stop();
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2144 _cmThread->stop();
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2145 if (G1StringDedup::is_enabled()) {
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2146 G1StringDedup::stop();
a45a4f5a9609 8044796: G1: Enable G1CollectedHeap::stop()
pliden
parents: 17976
diff changeset
2147 }
17947
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17937
diff changeset
2148 }
1772223a25a2 8037112: gc/g1/TestHumongousAllocInitialMark.java caused SIGSEGV
pliden
parents: 17937
diff changeset
2149
12233
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12179
diff changeset
2150 size_t G1CollectedHeap::conservative_max_heap_alignment() {
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12179
diff changeset
2151 return HeapRegion::max_region_size();
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12179
diff changeset
2152 }
40136aa2cdb1 8010722: assert: failed: heap size is too big for compressed oops
tschatzl
parents: 12179
diff changeset
2153
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2154 void G1CollectedHeap::ref_processing_init() {
1974
fd1d227ef1b9 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 1973
diff changeset
2155 // Reference processing in G1 currently works as follows:
fd1d227ef1b9 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 1973
diff changeset
2156 //
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2157 // * There are two reference processor instances. One is
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2158 // used to record and process discovered references
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2159 // during concurrent marking; the other is used to
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2160 // record and process references during STW pauses
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2161 // (both full and incremental).
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2162 // * Both ref processors need to 'span' the entire heap as
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2163 // the regions in the collection set may be dotted around.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2164 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2165 // * For the concurrent marking ref processor:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2166 // * Reference discovery is enabled at initial marking.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2167 // * Reference discovery is disabled and the discovered
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2168 // references processed etc during remarking.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2169 // * Reference discovery is MT (see below).
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2170 // * Reference discovery requires a barrier (see below).
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2171 // * Reference processing may or may not be MT
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2172 // (depending on the value of ParallelRefProcEnabled
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2173 // and ParallelGCThreads).
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2174 // * A full GC disables reference discovery by the CM
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2175 // ref processor and abandons any entries on it's
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2176 // discovered lists.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2177 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2178 // * For the STW processor:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2179 // * Non MT discovery is enabled at the start of a full GC.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2180 // * Processing and enqueueing during a full GC is non-MT.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2181 // * During a full GC, references are processed after marking.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2182 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2183 // * Discovery (may or may not be MT) is enabled at the start
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2184 // of an incremental evacuation pause.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2185 // * References are processed near the end of a STW evacuation pause.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2186 // * For both types of GC:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2187 // * Discovery is atomic - i.e. not concurrent.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2188 // * Reference discovery will not need a barrier.
1974
fd1d227ef1b9 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 1973
diff changeset
2189
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2190 SharedHeap::ref_processing_init();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2191 MemRegion mr = reserved_region();
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2192
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2193 // Concurrent Mark ref processor
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2194 _ref_processor_cm =
2369
92da084fefc9 6668573: CMS: reference processing crash if ParallelCMSThreads > ParallelGCThreads
ysr
parents: 2361
diff changeset
2195 new ReferenceProcessor(mr, // span
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2196 ParallelRefProcEnabled && (ParallelGCThreads > 1),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2197 // mt processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2198 (int) ParallelGCThreads,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2199 // degree of mt processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2200 (ParallelGCThreads > 1) || (ConcGCThreads > 1),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2201 // mt discovery
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2202 (int) MAX2(ParallelGCThreads, ConcGCThreads),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2203 // degree of mt discovery
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2204 false,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2205 // Reference discovery is not atomic
17976
8e20ef014b08 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 17948
diff changeset
2206 &_is_alive_closure_cm);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2207 // is alive closure
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2208 // (for efficiency/performance)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2209
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2210 // STW ref processor
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2211 _ref_processor_stw =
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2212 new ReferenceProcessor(mr, // span
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2213 ParallelRefProcEnabled && (ParallelGCThreads > 1),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2214 // mt processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2215 MAX2((int)ParallelGCThreads, 1),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2216 // degree of mt processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2217 (ParallelGCThreads > 1),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2218 // mt discovery
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2219 MAX2((int)ParallelGCThreads, 1),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2220 // degree of mt discovery
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2221 true,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2222 // Reference discovery is atomic
17976
8e20ef014b08 8043239: G1: Missing post barrier in processing of j.l.ref.Reference objects
brutisso
parents: 17948
diff changeset
2223 &_is_alive_closure_stw);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2224 // is alive closure
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
2225 // (for efficiency/performance)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2226 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2227
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2228 size_t G1CollectedHeap::capacity() const {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2229 return _hrm.length() * HeapRegion::GrainBytes;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2230 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2231
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2232 void G1CollectedHeap::reset_gc_time_stamps(HeapRegion* hr) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2233 assert(!hr->continuesHumongous(), "pre-condition");
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2234 hr->reset_gc_time_stamp();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2235 if (hr->startsHumongous()) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2236 uint first_index = hr->hrm_index() + 1;
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2237 uint last_index = hr->last_hc_index();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2238 for (uint i = first_index; i < last_index; i += 1) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2239 HeapRegion* chr = region_at(i);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2240 assert(chr->continuesHumongous(), "sanity");
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2241 chr->reset_gc_time_stamp();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2242 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2243 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2244 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2245
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2246 #ifndef PRODUCT
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2247 class CheckGCTimeStampsHRClosure : public HeapRegionClosure {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2248 private:
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2249 unsigned _gc_time_stamp;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2250 bool _failures;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2251
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2252 public:
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2253 CheckGCTimeStampsHRClosure(unsigned gc_time_stamp) :
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2254 _gc_time_stamp(gc_time_stamp), _failures(false) { }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2255
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2256 virtual bool doHeapRegion(HeapRegion* hr) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2257 unsigned region_gc_time_stamp = hr->get_gc_time_stamp();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2258 if (_gc_time_stamp != region_gc_time_stamp) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2259 gclog_or_tty->print_cr("Region "HR_FORMAT" has GC time stamp = %d, "
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2260 "expected %d", HR_FORMAT_PARAMS(hr),
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2261 region_gc_time_stamp, _gc_time_stamp);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2262 _failures = true;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2263 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2264 return false;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2265 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2266
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2267 bool failures() { return _failures; }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2268 };
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2269
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2270 void G1CollectedHeap::check_gc_time_stamps() {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2271 CheckGCTimeStampsHRClosure cl(_gc_time_stamp);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2272 heap_region_iterate(&cl);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2273 guarantee(!cl.failures(), "all GC time stamps should have been reset");
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2274 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2275 #endif // PRODUCT
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2276
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2277 void G1CollectedHeap::iterate_dirty_card_closure(CardTableEntryClosure* cl,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2278 DirtyCardQueue* into_cset_dcq,
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2279 bool concurrent,
17844
8847586c9037 8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents: 17833
diff changeset
2280 uint worker_i) {
889
15c5903cf9e1 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 884
diff changeset
2281 // Clean cards in the hot card cache
10246
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
2282 G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
2283 hot_card_cache->drain(worker_i, g1_rem_set(), into_cset_dcq);
889
15c5903cf9e1 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 884
diff changeset
2284
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2285 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
2286 size_t n_completed_buffers = 0;
1705
2d160770d2e5 6814437: G1: remove the _new_refs array
johnc
parents: 1666
diff changeset
2287 while (dcqs.apply_closure_to_completed_buffer(cl, worker_i, 0, true)) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2288 n_completed_buffers++;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2289 }
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
2290 g1_policy()->phase_times()->record_thread_work_item(G1GCPhaseTimes::UpdateRS, worker_i, n_completed_buffers);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2291 dcqs.clear_n_completed_buffers();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2292 assert(!dcqs.completed_buffers_exist_dirty(), "Completed buffers exist!");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2293 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2294
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2295
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2296 // Computes the sum of the storage used by the various regions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2297 size_t G1CollectedHeap::used() const {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2298 return _allocator->used();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2299 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2300
846
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
2301 size_t G1CollectedHeap::used_unlocked() const {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2302 return _allocator->used_unlocked();
846
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
2303 }
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
2304
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2305 class SumUsedClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2306 size_t _used;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2307 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2308 SumUsedClosure() : _used(0) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2309 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2310 if (!r->continuesHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2311 _used += r->used();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2312 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2313 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2314 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2315 size_t result() { return _used; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2316 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2317
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2318 size_t G1CollectedHeap::recalculate_used() const {
17757
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
2319 double recalculate_used_start = os::elapsedTime();
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
2320
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2321 SumUsedClosure blk;
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
2322 heap_region_iterate(&blk);
17757
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
2323
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
2324 g1_policy()->phase_times()->record_evac_fail_recalc_used_time((os::elapsedTime() - recalculate_used_start) * 1000.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2325 return blk.result();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2326 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2327
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2328 bool G1CollectedHeap::should_do_concurrent_full_gc(GCCause::Cause cause) {
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2329 switch (cause) {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2330 case GCCause::_gc_locker: return GCLockerInvokesConcurrent;
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2331 case GCCause::_java_lang_system_gc: return ExplicitGCInvokesConcurrent;
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2332 case GCCause::_g1_humongous_allocation: return true;
20522
d3fd73295885 8059466: Force young GC to initiate marking cycle when stat update is requested
sjohanss
parents: 20504
diff changeset
2333 case GCCause::_update_allocation_context_stats_inc: return true;
23472
047a642c9729 8065579: WB method to start G1 concurrent mark cycle should be introduced
kevinw
parents: 23463
diff changeset
2334 case GCCause::_wb_conc_mark: return true;
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2335 default: return false;
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2336 }
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2337 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2338
3285
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2339 #ifndef PRODUCT
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2340 void G1CollectedHeap::allocate_dummy_regions() {
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2341 // Let's fill up most of the region
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2342 size_t word_size = HeapRegion::GrainWords - 1024;
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2343 // And as a result the region we'll allocate will be humongous.
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2344 guarantee(isHumongous(word_size), "sanity");
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2345
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2346 for (uintx i = 0; i < G1DummyRegionsPerGC; ++i) {
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2347 // Let's use the existing mechanism for the allocation
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2348 HeapWord* dummy_obj = humongous_obj_allocate(word_size,
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2349 AllocationContext::system());
3285
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2350 if (dummy_obj != NULL) {
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2351 MemRegion mr(dummy_obj, word_size);
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2352 CollectedHeap::fill_with_object(mr);
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2353 } else {
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2354 // If we can't allocate once, we probably cannot allocate
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2355 // again. Let's get out of the loop.
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2356 break;
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2357 }
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2358 }
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2359 }
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2360 #endif // !PRODUCT
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
2361
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2362 void G1CollectedHeap::increment_old_marking_cycles_started() {
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2363 assert(_old_marking_cycles_started == _old_marking_cycles_completed ||
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2364 _old_marking_cycles_started == _old_marking_cycles_completed + 1,
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2365 err_msg("Wrong marking cycle count (started: %d, completed: %d)",
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2366 _old_marking_cycles_started, _old_marking_cycles_completed));
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2367
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2368 _old_marking_cycles_started++;
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2369 }
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2370
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2371 void G1CollectedHeap::increment_old_marking_cycles_completed(bool concurrent) {
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2372 MonitorLockerEx x(FullGCCount_lock, Mutex::_no_safepoint_check_flag);
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2373
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2374 // We assume that if concurrent == true, then the caller is a
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2375 // concurrent thread that was joined the Suspendible Thread
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2376 // Set. If there's ever a cheap way to check this, we should add an
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2377 // assert here.
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2378
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2379 // Given that this method is called at the end of a Full GC or of a
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2380 // concurrent cycle, and those can be nested (i.e., a Full GC can
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2381 // interrupt a concurrent cycle), the number of full collections
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2382 // completed should be either one (in the case where there was no
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2383 // nesting) or two (when a Full GC interrupted a concurrent cycle)
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2384 // behind the number of full collections started.
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2385
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2386 // This is the case for the inner caller, i.e. a Full GC.
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2387 assert(concurrent ||
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2388 (_old_marking_cycles_started == _old_marking_cycles_completed + 1) ||
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2389 (_old_marking_cycles_started == _old_marking_cycles_completed + 2),
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2390 err_msg("for inner caller (Full GC): _old_marking_cycles_started = %u "
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2391 "is inconsistent with _old_marking_cycles_completed = %u",
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2392 _old_marking_cycles_started, _old_marking_cycles_completed));
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2393
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2394 // This is the case for the outer caller, i.e. the concurrent cycle.
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2395 assert(!concurrent ||
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2396 (_old_marking_cycles_started == _old_marking_cycles_completed + 1),
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2397 err_msg("for outer caller (concurrent cycle): "
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2398 "_old_marking_cycles_started = %u "
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2399 "is inconsistent with _old_marking_cycles_completed = %u",
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2400 _old_marking_cycles_started, _old_marking_cycles_completed));
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2401
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2402 _old_marking_cycles_completed += 1;
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2403
1840
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1833
diff changeset
2404 // We need to clear the "in_progress" flag in the CM thread before
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1833
diff changeset
2405 // we wake up any waiters (especially when ExplicitInvokesConcurrent
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1833
diff changeset
2406 // is set) so that if a waiter requests another System.gc() it doesn't
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2407 // incorrectly see that a marking cycle is still in progress.
2030
fb712ff22571 7000559: G1: assertion failure !outer || (full_collections_started == _full_collections_completed + 1)
tonyp
parents: 1995
diff changeset
2408 if (concurrent) {
1840
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1833
diff changeset
2409 _cmThread->clear_in_progress();
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1833
diff changeset
2410 }
4e0094bc41fa 6983311: G1: LoopTest hangs when run with -XX:+ExplicitInvokesConcurrent
johnc
parents: 1833
diff changeset
2411
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2412 // This notify_all() will ensure that a thread that called
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2413 // System.gc() with (with ExplicitGCInvokesConcurrent set or not)
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2414 // and it's waiting for a full GC to finish will be woken up. It is
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2415 // waiting in VM_G1IncCollectionPause::doit_epilogue().
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2416 FullGCCount_lock->notify_all();
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2417 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2418
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13062
diff changeset
2419 void G1CollectedHeap::register_concurrent_cycle_start(const Ticks& start_time) {
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2420 _concurrent_cycle_started = true;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2421 _gc_timer_cm->register_gc_start(start_time);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2422
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2423 _gc_tracer_cm->report_gc_start(gc_cause(), _gc_timer_cm->gc_start());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2424 trace_heap_before_gc(_gc_tracer_cm);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2425 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2426
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2427 void G1CollectedHeap::register_concurrent_cycle_end() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2428 if (_concurrent_cycle_started) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2429 if (_cm->has_aborted()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2430 _gc_tracer_cm->report_concurrent_mode_failure();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2431 }
12179
f175e3678be2 8020692: TestGCEventMixed.java failed because of timestamp in event after end event
ehelin
parents: 12116
diff changeset
2432
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13062
diff changeset
2433 _gc_timer_cm->register_gc_end();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2434 _gc_tracer_cm->report_gc_end(_gc_timer_cm->gc_end(), _gc_timer_cm->time_partitions());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2435
22898
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2436 // Clear state variables to prepare for the next concurrent cycle.
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2437 _concurrent_cycle_started = false;
22898
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2438 _heap_summary_sent = false;
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2439 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2440 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2441
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2442 void G1CollectedHeap::trace_heap_after_concurrent_cycle() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2443 if (_concurrent_cycle_started) {
22898
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2444 // This function can be called when:
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2445 // the cleanup pause is run
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2446 // the concurrent cycle is aborted before the cleanup pause.
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2447 // the concurrent cycle is aborted after the cleanup pause,
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2448 // but before the concurrent cycle end has been registered.
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2449 // Make sure that we only send the heap information once.
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2450 if (!_heap_summary_sent) {
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2451 trace_heap_after_gc(_gc_tracer_cm);
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2452 _heap_summary_sent = true;
f97f21d8d58c 8055416: Several vm/gc/heap/summary "After GC" events emitted for the same GC ID
stefank
parents: 22897
diff changeset
2453 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2454 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2455 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2456
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2457 G1YCType G1CollectedHeap::yc_type() {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2458 bool is_young = g1_policy()->gcs_are_young();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2459 bool is_initial_mark = g1_policy()->during_initial_mark_pause();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2460 bool is_during_mark = mark_in_progress();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2461
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2462 if (is_initial_mark) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2463 return InitialMark;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2464 } else if (is_during_mark) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2465 return DuringMark;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2466 } else if (is_young) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2467 return Normal;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2468 } else {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2469 return Mixed;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2470 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2471 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2472
1088
3fc996d4edd2 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 1045
diff changeset
2473 void G1CollectedHeap::collect(GCCause::Cause cause) {
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2474 assert_heap_not_locked();
1088
3fc996d4edd2 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 1045
diff changeset
2475
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
2476 uint gc_count_before;
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
2477 uint old_marking_count_before;
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
2478 uint full_gc_count_before;
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2479 bool retry_gc;
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2480
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2481 do {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2482 retry_gc = false;
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2483
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2484 {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2485 MutexLocker ml(Heap_lock);
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2486
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2487 // Read the GC count while holding the Heap_lock
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2488 gc_count_before = total_collections();
20571
1d6eb209432a 8058568: GC cleanup phase can cause G1 skipping a System.gc()
sjohanss
parents: 20543
diff changeset
2489 full_gc_count_before = total_full_collections();
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2490 old_marking_count_before = _old_marking_cycles_started;
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2491 }
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2492
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2493 if (should_do_concurrent_full_gc(cause)) {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2494 // Schedule an initial-mark evacuation pause that will start a
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2495 // concurrent cycle. We're setting word_size to 0 which means that
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2496 // we are not requesting a post-GC allocation.
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2497 VM_G1IncCollectionPause op(gc_count_before,
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
2498 0, /* word_size */
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2499 true, /* should_initiate_conc_mark */
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2500 g1_policy()->max_pause_time_ms(),
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2501 cause);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2502 op.set_allocation_context(AllocationContext::current());
5963
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2503
1088
3fc996d4edd2 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 1045
diff changeset
2504 VMThread::execute(&op);
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2505 if (!op.pause_succeeded()) {
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
2506 if (old_marking_count_before == _old_marking_cycles_started) {
5963
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2507 retry_gc = op.should_retry_gc();
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2508 } else {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2509 // A Full GC happened while we were trying to schedule the
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2510 // initial-mark GC. No point in starting a new cycle given
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2511 // that the whole heap was collected anyway.
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2512 }
5963
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2513
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2514 if (retry_gc) {
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2515 if (GC_locker::is_active_and_needs_gc()) {
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2516 GC_locker::stall_until_clear();
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2517 }
64bf7c8270cb 7147724: G1: hang in SurrogateLockerThread::manipulatePLL
johnc
parents: 4912
diff changeset
2518 }
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2519 }
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2520 } else {
20357
4bfc44ba0d19 8055098: WB API should be extended to provide information about size and age of object.
tschatzl
parents: 20337
diff changeset
2521 if (cause == GCCause::_gc_locker || cause == GCCause::_wb_young_gc
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2522 DEBUG_ONLY(|| cause == GCCause::_scavenge_alot)) {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2523
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2524 // Schedule a standard evacuation pause. We're setting word_size
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2525 // to 0 which means that we are not requesting a post-GC allocation.
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2526 VM_G1IncCollectionPause op(gc_count_before,
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2527 0, /* word_size */
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2528 false, /* should_initiate_conc_mark */
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2529 g1_policy()->max_pause_time_ms(),
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2530 cause);
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2531 VMThread::execute(&op);
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2532 } else {
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2533 // Schedule a Full GC.
20571
1d6eb209432a 8058568: GC cleanup phase can cause G1 skipping a System.gc()
sjohanss
parents: 20543
diff changeset
2534 VM_G1CollectFull op(gc_count_before, full_gc_count_before, cause);
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2535 VMThread::execute(&op);
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2536 }
1088
3fc996d4edd2 6902303: G1: ScavengeALot should cause an incremental, rather than a full, collection
ysr
parents: 1045
diff changeset
2537 }
4910
caa4652b4414 7129892: G1: explicit marking cycle initiation might fail to initiate a marking cycle
tonyp
parents: 4875
diff changeset
2538 } while (retry_gc);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2539 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2540
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2541 bool G1CollectedHeap::is_in(const void* p) const {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2542 if (_hrm.reserved().contains(p)) {
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2543 // Given that we know that p is in the reserved space,
4708
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4097
diff changeset
2544 // heap_region_containing_raw() should successfully
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4097
diff changeset
2545 // return the containing region.
3c648b9ad052 7121373: Clean up CollectedHeap::is_in
stefank
parents: 4097
diff changeset
2546 HeapRegion* hr = heap_region_containing_raw(p);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2547 return hr->is_in(p);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2548 } else {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
2549 return false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2550 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2551 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2552
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2553 #ifdef ASSERT
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2554 bool G1CollectedHeap::is_in_exact(const void* p) const {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2555 bool contains = reserved_region().contains(p);
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2556 bool available = _hrm.is_available(addr_to_region((HeapWord*)p));
20337
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2557 if (contains && available) {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2558 return true;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2559 } else {
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2560 return false;
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2561 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2562 }
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2563 #endif
1f1d373cd044 8038423: G1: Decommit memory within heap
tschatzl
parents: 20336
diff changeset
2564
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2565 // Iteration functions.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2566
20309
a08bb8e45ba1 8054341: Remove some obsolete code in G1CollectedHeap class
tschatzl
parents: 20307
diff changeset
2567 // Applies an ExtendedOopClosure onto all references of objects within a HeapRegion.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2568
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2569 class IterateOopClosureRegionClosure: public HeapRegionClosure {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
2570 ExtendedOopClosure* _cl;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2571 public:
20309
a08bb8e45ba1 8054341: Remove some obsolete code in G1CollectedHeap class
tschatzl
parents: 20307
diff changeset
2572 IterateOopClosureRegionClosure(ExtendedOopClosure* cl) : _cl(cl) {}
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2573 bool doHeapRegion(HeapRegion* r) {
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2574 if (!r->continuesHumongous()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2575 r->oop_iterate(_cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2576 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2577 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2578 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2579 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2580
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
2581 void G1CollectedHeap::oop_iterate(ExtendedOopClosure* cl) {
20309
a08bb8e45ba1 8054341: Remove some obsolete code in G1CollectedHeap class
tschatzl
parents: 20307
diff changeset
2582 IterateOopClosureRegionClosure blk(cl);
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
2583 heap_region_iterate(&blk);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2584 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2585
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2586 // Iterates an ObjectClosure over all objects within a HeapRegion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2587
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2588 class IterateObjectClosureRegionClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2589 ObjectClosure* _cl;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2590 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2591 IterateObjectClosureRegionClosure(ObjectClosure* cl) : _cl(cl) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2592 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2593 if (! r->continuesHumongous()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2594 r->object_iterate(_cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2595 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2596 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2597 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2598 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2599
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
2600 void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2601 IterateObjectClosureRegionClosure blk(cl);
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
2602 heap_region_iterate(&blk);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2603 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2604
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2605 // Calls a SpaceClosure on a HeapRegion.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2606
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2607 class SpaceClosureRegionClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2608 SpaceClosure* _cl;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2609 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2610 SpaceClosureRegionClosure(SpaceClosure* cl) : _cl(cl) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2611 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2612 _cl->do_space(r);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2613 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2614 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2615 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2616
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2617 void G1CollectedHeap::space_iterate(SpaceClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2618 SpaceClosureRegionClosure blk(cl);
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
2619 heap_region_iterate(&blk);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2620 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2621
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
2622 void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2623 _hrm.iterate(cl);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2624 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2625
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2626 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2627 G1CollectedHeap::heap_region_par_iterate_chunked(HeapRegionClosure* cl,
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2628 uint worker_id,
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2629 uint num_workers,
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2630 jint claim_value) const {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2631 _hrm.par_iterate(cl, worker_id, num_workers, claim_value);
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2632 }
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2633
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2634 class ResetClaimValuesClosure: public HeapRegionClosure {
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2635 public:
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2636 bool doHeapRegion(HeapRegion* r) {
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2637 r->set_claim_value(HeapRegion::InitialClaimValue);
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2638 return false;
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2639 }
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2640 };
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2641
4783
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
2642 void G1CollectedHeap::reset_heap_region_claim_values() {
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2643 ResetClaimValuesClosure blk;
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2644 heap_region_iterate(&blk);
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2645 }
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
2646
4783
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
2647 void G1CollectedHeap::reset_cset_heap_region_claim_values() {
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
2648 ResetClaimValuesClosure blk;
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
2649 collection_set_iterate(&blk);
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
2650 }
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
2651
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2652 #ifdef ASSERT
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2653 // This checks whether all regions in the heap have the correct claim
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2654 // value. I also piggy-backed on this a check to ensure that the
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2655 // humongous_start_region() information on "continues humongous"
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2656 // regions is correct.
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2657
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2658 class CheckClaimValuesClosure : public HeapRegionClosure {
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2659 private:
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2660 jint _claim_value;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2661 uint _failures;
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2662 HeapRegion* _sh_region;
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2663
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2664 public:
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2665 CheckClaimValuesClosure(jint claim_value) :
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2666 _claim_value(claim_value), _failures(0), _sh_region(NULL) { }
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2667 bool doHeapRegion(HeapRegion* r) {
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2668 if (r->claim_value() != _claim_value) {
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2669 gclog_or_tty->print_cr("Region " HR_FORMAT ", "
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2670 "claim value = %d, should be %d",
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2671 HR_FORMAT_PARAMS(r),
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2672 r->claim_value(), _claim_value);
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2673 ++_failures;
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2674 }
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2675 if (!r->isHumongous()) {
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2676 _sh_region = NULL;
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2677 } else if (r->startsHumongous()) {
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2678 _sh_region = r;
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2679 } else if (r->continuesHumongous()) {
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2680 if (r->humongous_start_region() != _sh_region) {
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2681 gclog_or_tty->print_cr("Region " HR_FORMAT ", "
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2682 "HS = "PTR_FORMAT", should be "PTR_FORMAT,
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2683 HR_FORMAT_PARAMS(r),
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2684 r->humongous_start_region(),
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2685 _sh_region);
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2686 ++_failures;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2687 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2688 }
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2689 return false;
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2690 }
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2691 uint failures() { return _failures; }
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2692 };
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2693
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2694 bool G1CollectedHeap::check_heap_region_claim_values(jint claim_value) {
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2695 CheckClaimValuesClosure cl(claim_value);
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2696 heap_region_iterate(&cl);
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2697 return cl.failures() == 0;
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2698 }
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2699
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2700 class CheckClaimValuesInCSetHRClosure: public HeapRegionClosure {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2701 private:
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2702 jint _claim_value;
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2703 uint _failures;
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2704
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2705 public:
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2706 CheckClaimValuesInCSetHRClosure(jint claim_value) :
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2707 _claim_value(claim_value), _failures(0) { }
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2708
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2709 uint failures() { return _failures; }
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2710
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2711 bool doHeapRegion(HeapRegion* hr) {
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2712 assert(hr->in_collection_set(), "how?");
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2713 assert(!hr->isHumongous(), "H-region in CSet");
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2714 if (hr->claim_value() != _claim_value) {
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2715 gclog_or_tty->print_cr("CSet Region " HR_FORMAT ", "
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2716 "claim value = %d, should be %d",
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2717 HR_FORMAT_PARAMS(hr),
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2718 hr->claim_value(), _claim_value);
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2719 _failures += 1;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2720 }
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2721 return false;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2722 }
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2723 };
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2724
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2725 bool G1CollectedHeap::check_cset_heap_region_claim_values(jint claim_value) {
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2726 CheckClaimValuesInCSetHRClosure cl(claim_value);
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2727 collection_set_iterate(&cl);
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2728 return cl.failures() == 0;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2729 }
355
0edda524b58c 6722565: G1: assert !r->is_on_unclean_list() fires
tonyp
parents: 354
diff changeset
2730 #endif // ASSERT
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2731
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2732 // Clear the cached CSet starting regions and (more importantly)
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2733 // the time stamps. Called when we reset the GC time stamp.
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2734 void G1CollectedHeap::clear_cset_start_regions() {
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2735 assert(_worker_cset_start_region != NULL, "sanity");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2736 assert(_worker_cset_start_region_time_stamp != NULL, "sanity");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2737
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2738 int n_queues = MAX2((int)ParallelGCThreads, 1);
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2739 for (int i = 0; i < n_queues; i++) {
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2740 _worker_cset_start_region[i] = NULL;
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2741 _worker_cset_start_region_time_stamp[i] = 0;
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2742 }
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2743 }
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2744
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2745 // Given the id of a worker, obtain or calculate a suitable
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2746 // starting region for iterating over the current collection set.
17844
8847586c9037 8016302: Change type of the number of GC workers to unsigned int (2)
vkempik
parents: 17833
diff changeset
2747 HeapRegion* G1CollectedHeap::start_cset_region_for_worker(uint worker_i) {
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2748 assert(get_gc_time_stamp() > 0, "should have been updated by now");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2749
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2750 HeapRegion* result = NULL;
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2751 unsigned gc_time_stamp = get_gc_time_stamp();
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2752
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2753 if (_worker_cset_start_region_time_stamp[worker_i] == gc_time_stamp) {
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2754 // Cached starting region for current worker was set
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2755 // during the current pause - so it's valid.
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2756 // Note: the cached starting heap region may be NULL
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2757 // (when the collection set is empty).
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2758 result = _worker_cset_start_region[worker_i];
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2759 assert(result == NULL || result->in_collection_set(), "sanity");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2760 return result;
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2761 }
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2762
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2763 // The cached entry was not valid so let's calculate
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2764 // a suitable starting heap region for this worker.
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2765
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2766 // We want the parallel threads to start their collection
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2767 // set iteration at different collection set regions to
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2768 // avoid contention.
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2769 // If we have:
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2770 // n collection set regions
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2771 // p threads
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2772 // Then thread t will start at region floor ((t * n) / p)
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2773
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2774 result = g1_policy()->collection_set();
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2775 if (G1CollectedHeap::use_parallel_gc_threads()) {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2776 uint cs_size = g1_policy()->cset_region_length();
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
2777 uint active_workers = workers()->active_workers();
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2778 assert(UseDynamicNumberOfGCThreads ||
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2779 active_workers == workers()->total_workers(),
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2780 "Unless dynamic should use total workers");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2781
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2782 uint end_ind = (cs_size * worker_i) / active_workers;
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2783 uint start_ind = 0;
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2784
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2785 if (worker_i > 0 &&
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2786 _worker_cset_start_region_time_stamp[worker_i - 1] == gc_time_stamp) {
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2787 // Previous workers starting region is valid
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2788 // so let's iterate from there
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2789 start_ind = (cs_size * (worker_i - 1)) / active_workers;
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2790 result = _worker_cset_start_region[worker_i - 1];
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2791 }
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2792
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
2793 for (uint i = start_ind; i < end_ind; i++) {
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2794 result = result->next_in_collection_set();
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2795 }
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2796 }
4709
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2797
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2798 // Note: the calculated starting heap region may be NULL
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2799 // (when the collection set is empty).
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2800 assert(result == NULL || result->in_collection_set(), "sanity");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2801 assert(_worker_cset_start_region_time_stamp[worker_i] != gc_time_stamp,
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2802 "should be updated only once per pause");
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2803 _worker_cset_start_region[worker_i] = result;
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2804 OrderAccess::storestore();
fd2b426c30db 7119908: G1: Cache CSet start region for each worker for subsequent reuse
johnc
parents: 4708
diff changeset
2805 _worker_cset_start_region_time_stamp[worker_i] = gc_time_stamp;
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2806 return result;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2807 }
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
2808
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2809 void G1CollectedHeap::collection_set_iterate(HeapRegionClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2810 HeapRegion* r = g1_policy()->collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2811 while (r != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2812 HeapRegion* next = r->next_in_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2813 if (cl->doHeapRegion(r)) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2814 cl->incomplete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2815 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2816 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2817 r = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2818 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2819 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2820
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2821 void G1CollectedHeap::collection_set_iterate_from(HeapRegion* r,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2822 HeapRegionClosure *cl) {
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2823 if (r == NULL) {
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2824 // The CSet is empty so there's nothing to do.
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2825 return;
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2826 }
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
2827
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2828 assert(r->in_collection_set(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2829 "Start region must be a member of the collection set.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2830 HeapRegion* cur = r;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2831 while (cur != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2832 HeapRegion* next = cur->next_in_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2833 if (cl->doHeapRegion(cur) && false) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2834 cl->incomplete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2835 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2836 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2837 cur = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2838 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2839 cur = g1_policy()->collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2840 while (cur != r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2841 HeapRegion* next = cur->next_in_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2842 if (cl->doHeapRegion(cur) && false) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2843 cl->incomplete();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2844 return;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2845 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2846 cur = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2847 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2848 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2849
20304
a22acf6d7598 8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents: 20282
diff changeset
2850 HeapRegion* G1CollectedHeap::next_compaction_region(const HeapRegion* from) const {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2851 HeapRegion* result = _hrm.next_region_in_heap(from);
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2852 while (result != NULL && result->isHumongous()) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2853 result = _hrm.next_region_in_heap(result);
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2854 }
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
2855 return result;
20304
a22acf6d7598 8048112: G1 Full GC needs to support the case when the very first region is not available
tschatzl
parents: 20282
diff changeset
2856 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2857
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2858 Space* G1CollectedHeap::space_containing(const void* addr) const {
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
2859 return heap_region_containing(addr);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2860 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2861
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2862 HeapWord* G1CollectedHeap::block_start(const void* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2863 Space* sp = space_containing(addr);
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
2864 return sp->block_start(addr);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2865 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2866
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2867 size_t G1CollectedHeap::block_size(const HeapWord* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2868 Space* sp = space_containing(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2869 return sp->block_size(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2870 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2871
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2872 bool G1CollectedHeap::block_is_obj(const HeapWord* addr) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2873 Space* sp = space_containing(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2874 return sp->block_is_obj(addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2875 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2876
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2877 bool G1CollectedHeap::supports_tlab_allocation() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2878 return true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2879 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2880
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2881 size_t G1CollectedHeap::tlab_capacity(Thread* ignored) const {
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2882 return (_g1_policy->young_list_target_length() - young_list()->survivor_length()) * HeapRegion::GrainBytes;
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2883 }
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2884
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2885 size_t G1CollectedHeap::tlab_used(Thread* ignored) const {
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2886 return young_list()->eden_used_bytes();
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2887 }
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2888
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2889 // For G1 TLABs should not contain humongous objects, so the maximum TLAB size
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2890 // must be smaller than the humongous object limit.
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2891 size_t G1CollectedHeap::max_tlab_size() const {
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2892 return align_size_down(_humongous_object_threshold_in_words - 1, MinObjAlignment);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2893 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2894
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2895 size_t G1CollectedHeap::unsafe_max_tlab_alloc(Thread* ignored) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2896 // Return the remaining space in the cur alloc region, but not less than
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2897 // the min TLAB size.
1313
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1282
diff changeset
2898
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1282
diff changeset
2899 // Also, this value can be at most the humongous object threshold,
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
2900 // since we can't allow tlabs to grow big enough to accommodate
1313
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1282
diff changeset
2901 // humongous objects.
664ae0c5e0e5 6755988: G1: assert(new_obj != 0 || ... "should be forwarded")
johnc
parents: 1282
diff changeset
2902
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
2903 HeapRegion* hr = _allocator->mutator_alloc_region(AllocationContext::current())->get();
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2904 size_t max_tlab = max_tlab_size() * wordSize;
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
2905 if (hr == NULL) {
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2906 return max_tlab;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2907 } else {
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
2908 return MIN2(MAX2(hr->free(), (size_t) MinTLABSize), max_tlab);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2909 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2910 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2911
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2912 size_t G1CollectedHeap::max_capacity() const {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
2913 return _hrm.reserved().byte_size();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2914 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2915
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2916 jlong G1CollectedHeap::millis_since_last_gc() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2917 // assert(false, "NYI");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2918 return 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2919 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2920
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2921 void G1CollectedHeap::prepare_for_verify() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2922 if (SafepointSynchronize::is_at_safepoint() || ! UseTLAB) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2923 ensure_parsability(false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2924 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2925 g1_rem_set()->prepare_for_verify();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2926 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
2927
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2928 bool G1CollectedHeap::allocated_since_marking(oop obj, HeapRegion* hr,
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2929 VerifyOption vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2930 switch (vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2931 case VerifyOption_G1UsePrevMarking:
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2932 return hr->obj_allocated_since_prev_marking(obj);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2933 case VerifyOption_G1UseNextMarking:
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2934 return hr->obj_allocated_since_next_marking(obj);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2935 case VerifyOption_G1UseMarkWord:
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2936 return false;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2937 default:
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2938 ShouldNotReachHere();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2939 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2940 return false; // keep some compilers happy
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2941 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2942
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2943 HeapWord* G1CollectedHeap::top_at_mark_start(HeapRegion* hr, VerifyOption vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2944 switch (vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2945 case VerifyOption_G1UsePrevMarking: return hr->prev_top_at_mark_start();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2946 case VerifyOption_G1UseNextMarking: return hr->next_top_at_mark_start();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2947 case VerifyOption_G1UseMarkWord: return NULL;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2948 default: ShouldNotReachHere();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2949 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2950 return NULL; // keep some compilers happy
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2951 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2952
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2953 bool G1CollectedHeap::is_marked(oop obj, VerifyOption vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2954 switch (vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2955 case VerifyOption_G1UsePrevMarking: return isMarkedPrev(obj);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2956 case VerifyOption_G1UseNextMarking: return isMarkedNext(obj);
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2957 case VerifyOption_G1UseMarkWord: return obj->is_gc_marked();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2958 default: ShouldNotReachHere();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2959 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2960 return false; // keep some compilers happy
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2961 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2962
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2963 const char* G1CollectedHeap::top_at_mark_start_str(VerifyOption vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2964 switch (vo) {
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2965 case VerifyOption_G1UsePrevMarking: return "PTAMS";
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2966 case VerifyOption_G1UseNextMarking: return "NTAMS";
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2967 case VerifyOption_G1UseMarkWord: return "NONE";
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2968 default: ShouldNotReachHere();
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2969 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2970 return NULL; // keep some compilers happy
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2971 }
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
2972
17636
889068b9a088 8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents: 17634
diff changeset
2973 class VerifyRootsClosure: public OopClosure {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2974 private:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2975 G1CollectedHeap* _g1h;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2976 VerifyOption _vo;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2977 bool _failures;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2978 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2979 // _vo == UsePrevMarking -> use "prev" marking information,
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2980 // _vo == UseNextMarking -> use "next" marking information,
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2981 // _vo == UseMarkWord -> use mark word from object header.
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2982 VerifyRootsClosure(VerifyOption vo) :
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2983 _g1h(G1CollectedHeap::heap()),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2984 _vo(vo),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2985 _failures(false) { }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2986
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2987 bool failures() { return _failures; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2988
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2989 template <class T> void do_oop_nv(T* p) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2990 T heap_oop = oopDesc::load_heap_oop(p);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2991 if (!oopDesc::is_null(heap_oop)) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2992 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2993 if (_g1h->is_obj_dead_cond(obj, _vo)) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2994 gclog_or_tty->print_cr("Root location "PTR_FORMAT" "
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2995 "points to dead obj "PTR_FORMAT, p, (void*) obj);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2996 if (_vo == VerifyOption_G1UseMarkWord) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2997 gclog_or_tty->print_cr(" Mark word: "PTR_FORMAT, (void*)(obj->mark()));
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2998 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
2999 obj->print_on(gclog_or_tty);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3000 _failures = true;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3001 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3002 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3003 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3004
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3005 void do_oop(oop* p) { do_oop_nv(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3006 void do_oop(narrowOop* p) { do_oop_nv(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3007 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3008
17636
889068b9a088 8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents: 17634
diff changeset
3009 class G1VerifyCodeRootOopClosure: public OopClosure {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3010 G1CollectedHeap* _g1h;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3011 OopClosure* _root_cl;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3012 nmethod* _nm;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3013 VerifyOption _vo;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3014 bool _failures;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3015
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3016 template <class T> void do_oop_work(T* p) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3017 // First verify that this root is live
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3018 _root_cl->do_oop(p);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3019
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3020 if (!G1VerifyHeapRegionCodeRoots) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3021 // We're not verifying the code roots attached to heap region.
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3022 return;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3023 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3024
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3025 // Don't check the code roots during marking verification in a full GC
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3026 if (_vo == VerifyOption_G1UseMarkWord) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3027 return;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3028 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3029
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3030 // Now verify that the current nmethod (which contains p) is
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3031 // in the code root list of the heap region containing the
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3032 // object referenced by p.
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3033
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3034 T heap_oop = oopDesc::load_heap_oop(p);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3035 if (!oopDesc::is_null(heap_oop)) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3036 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3037
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3038 // Now fetch the region containing the object
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3039 HeapRegion* hr = _g1h->heap_region_containing(obj);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3040 HeapRegionRemSet* hrrs = hr->rem_set();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3041 // Verify that the strong code root list for this region
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3042 // contains the nmethod
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3043 if (!hrrs->strong_code_roots_list_contains(_nm)) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3044 gclog_or_tty->print_cr("Code root location "PTR_FORMAT" "
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3045 "from nmethod "PTR_FORMAT" not in strong "
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3046 "code roots for region ["PTR_FORMAT","PTR_FORMAT")",
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3047 p, _nm, hr->bottom(), hr->end());
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3048 _failures = true;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3049 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3050 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3051 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3052
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3053 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3054 G1VerifyCodeRootOopClosure(G1CollectedHeap* g1h, OopClosure* root_cl, VerifyOption vo):
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3055 _g1h(g1h), _root_cl(root_cl), _vo(vo), _nm(NULL), _failures(false) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3056
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3057 void do_oop(oop* p) { do_oop_work(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3058 void do_oop(narrowOop* p) { do_oop_work(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3059
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3060 void set_nmethod(nmethod* nm) { _nm = nm; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3061 bool failures() { return _failures; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3062 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3063
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3064 class G1VerifyCodeRootBlobClosure: public CodeBlobClosure {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3065 G1VerifyCodeRootOopClosure* _oop_cl;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3066
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3067 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3068 G1VerifyCodeRootBlobClosure(G1VerifyCodeRootOopClosure* oop_cl):
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3069 _oop_cl(oop_cl) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3070
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3071 void do_code_blob(CodeBlob* cb) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3072 nmethod* nm = cb->as_nmethod_or_null();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3073 if (nm != NULL) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3074 _oop_cl->set_nmethod(nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3075 nm->oops_do(_oop_cl);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3076 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3077 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3078 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3079
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3080 class YoungRefCounterClosure : public OopClosure {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3081 G1CollectedHeap* _g1h;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3082 int _count;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3083 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3084 YoungRefCounterClosure(G1CollectedHeap* g1h) : _g1h(g1h), _count(0) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3085 void do_oop(oop* p) { if (_g1h->is_in_young(*p)) { _count++; } }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3086 void do_oop(narrowOop* p) { ShouldNotReachHere(); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3087
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3088 int count() { return _count; }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3089 void reset_count() { _count = 0; };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3090 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3091
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3092 class VerifyKlassClosure: public KlassClosure {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3093 YoungRefCounterClosure _young_ref_counter_closure;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3094 OopClosure *_oop_closure;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3095 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3096 VerifyKlassClosure(G1CollectedHeap* g1h, OopClosure* cl) : _young_ref_counter_closure(g1h), _oop_closure(cl) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3097 void do_klass(Klass* k) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3098 k->oops_do(_oop_closure);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3099
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3100 _young_ref_counter_closure.reset_count();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3101 k->oops_do(&_young_ref_counter_closure);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3102 if (_young_ref_counter_closure.count() > 0) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3103 guarantee(k->has_modified_oops(), err_msg("Klass %p, has young refs but is not dirty.", k));
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3104 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3105 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3106 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3107
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3108 class VerifyLivenessOopClosure: public OopClosure {
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3109 G1CollectedHeap* _g1h;
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3110 VerifyOption _vo;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3111 public:
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3112 VerifyLivenessOopClosure(G1CollectedHeap* g1h, VerifyOption vo):
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3113 _g1h(g1h), _vo(vo)
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3114 { }
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3115 void do_oop(narrowOop *p) { do_oop_work(p); }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3116 void do_oop( oop *p) { do_oop_work(p); }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3117
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3118 template <class T> void do_oop_work(T *p) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3119 oop obj = oopDesc::load_decode_heap_oop(p);
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3120 guarantee(obj == NULL || !_g1h->is_obj_dead_cond(obj, _vo),
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3121 "Dead object referenced by a not dead object");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3122 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3123 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3124
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3125 class VerifyObjsInRegionClosure: public ObjectClosure {
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
3126 private:
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3127 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3128 size_t _live_bytes;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3129 HeapRegion *_hr;
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3130 VerifyOption _vo;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3131 public:
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3132 // _vo == UsePrevMarking -> use "prev" marking information,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3133 // _vo == UseNextMarking -> use "next" marking information,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3134 // _vo == UseMarkWord -> use mark word from object header.
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3135 VerifyObjsInRegionClosure(HeapRegion *hr, VerifyOption vo)
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3136 : _live_bytes(0), _hr(hr), _vo(vo) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3137 _g1h = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3138 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3139 void do_object(oop o) {
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3140 VerifyLivenessOopClosure isLive(_g1h, _vo);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3141 assert(o != NULL, "Huh?");
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3142 if (!_g1h->is_obj_dead_cond(o, _vo)) {
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3143 // If the object is alive according to the mark word,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3144 // then verify that the marking information agrees.
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3145 // Note we can't verify the contra-positive of the
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3146 // above: if the object is dead (according to the mark
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3147 // word), it may not be marked, or may have been marked
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3148 // but has since became dead, or may have been allocated
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3149 // since the last marking.
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3150 if (_vo == VerifyOption_G1UseMarkWord) {
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3151 guarantee(!_g1h->is_obj_dead(o), "mark word and concurrent mark mismatch");
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3152 }
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3153
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
3154 o->oop_iterate_no_header(&isLive);
1389
5dbd9300cf9c 6943926: G1: Integer overflow during heap region verification
johnc
parents: 1388
diff changeset
3155 if (!_hr->obj_allocated_since_prev_marking(o)) {
5dbd9300cf9c 6943926: G1: Integer overflow during heap region verification
johnc
parents: 1388
diff changeset
3156 size_t obj_size = o->size(); // Make sure we don't overflow
5dbd9300cf9c 6943926: G1: Integer overflow during heap region verification
johnc
parents: 1388
diff changeset
3157 _live_bytes += (obj_size * HeapWordSize);
5dbd9300cf9c 6943926: G1: Integer overflow during heap region verification
johnc
parents: 1388
diff changeset
3158 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3159 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3160 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3161 size_t live_bytes() { return _live_bytes; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3162 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3163
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3164 class PrintObjsInRegionClosure : public ObjectClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3165 HeapRegion *_hr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3166 G1CollectedHeap *_g1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3167 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3168 PrintObjsInRegionClosure(HeapRegion *hr) : _hr(hr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3169 _g1 = G1CollectedHeap::heap();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3170 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3171
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3172 void do_object(oop o) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3173 if (o != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3174 HeapWord *start = (HeapWord *) o;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3175 size_t word_sz = o->size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3176 gclog_or_tty->print("\nPrinting obj "PTR_FORMAT" of size " SIZE_FORMAT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3177 " isMarkedPrev %d isMarkedNext %d isAllocSince %d\n",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3178 (void*) o, word_sz,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3179 _g1->isMarkedPrev(o),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3180 _g1->isMarkedNext(o),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3181 _hr->obj_allocated_since_prev_marking(o));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3182 HeapWord *end = start + word_sz;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3183 HeapWord *cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3184 int *val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3185 for (cur = start; cur < end; cur++) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3186 val = (int *) cur;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3187 gclog_or_tty->print("\t "PTR_FORMAT":"PTR_FORMAT"\n", val, *val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3188 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3189 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3190 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3191 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3192
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3193 class VerifyRegionClosure: public HeapRegionClosure {
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
3194 private:
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
3195 bool _par;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
3196 VerifyOption _vo;
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
3197 bool _failures;
811
830ca2573896 6850846: G1: extend G1 marking verification
tonyp
parents: 807
diff changeset
3198 public:
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3199 // _vo == UsePrevMarking -> use "prev" marking information,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3200 // _vo == UseNextMarking -> use "next" marking information,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3201 // _vo == UseMarkWord -> use mark word from object header.
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3202 VerifyRegionClosure(bool par, VerifyOption vo)
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3203 : _par(par),
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3204 _vo(vo),
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3205 _failures(false) {}
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3206
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3207 bool failures() {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3208 return _failures;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3209 }
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3210
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3211 bool doHeapRegion(HeapRegion* r) {
637
25e146966e7c 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 636
diff changeset
3212 if (!r->continuesHumongous()) {
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3213 bool failures = false;
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3214 r->verify(_vo, &failures);
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3215 if (failures) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3216 _failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3217 } else {
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3218 VerifyObjsInRegionClosure not_dead_yet_cl(r, _vo);
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3219 r->object_iterate(&not_dead_yet_cl);
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3220 if (_vo != VerifyOption_G1UseNextMarking) {
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3221 if (r->max_live_bytes() < not_dead_yet_cl.live_bytes()) {
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3222 gclog_or_tty->print_cr("["PTR_FORMAT","PTR_FORMAT"] "
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3223 "max_live_bytes "SIZE_FORMAT" "
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3224 "< calculated "SIZE_FORMAT,
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3225 r->bottom(), r->end(),
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3226 r->max_live_bytes(),
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3227 not_dead_yet_cl.live_bytes());
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3228 _failures = true;
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3229 }
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3230 } else {
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3231 // When vo == UseNextMarking we cannot currently do a sanity
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3232 // check on the live bytes as the calculation has not been
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
3233 // finalized yet.
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3234 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3235 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3236 }
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3237 return false; // stop the region iteration if we hit a failure
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3238 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3239 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3240
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3241 // This is the task used for parallel verification of the heap regions
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3242
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3243 class G1ParVerifyTask: public AbstractGangTask {
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3244 private:
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3245 G1CollectedHeap* _g1h;
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3246 VerifyOption _vo;
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3247 bool _failures;
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3248
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3249 public:
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3250 // _vo == UsePrevMarking -> use "prev" marking information,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3251 // _vo == UseNextMarking -> use "next" marking information,
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3252 // _vo == UseMarkWord -> use mark word from object header.
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3253 G1ParVerifyTask(G1CollectedHeap* g1h, VerifyOption vo) :
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3254 AbstractGangTask("Parallel verify task"),
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3255 _g1h(g1h),
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3256 _vo(vo),
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3257 _failures(false) { }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3258
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3259 bool failures() {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3260 return _failures;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3261 }
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3262
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
3263 void work(uint worker_id) {
637
25e146966e7c 6817419: G1: Enable extensive verification for humongous regions
iveresov
parents: 636
diff changeset
3264 HandleMark hm;
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3265 VerifyRegionClosure blk(true, _vo);
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
3266 _g1h->heap_region_par_iterate_chunked(&blk, worker_id,
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3267 _g1h->workers()->active_workers(),
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3268 HeapRegion::ParVerifyClaimValue);
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3269 if (blk.failures()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3270 _failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3271 }
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3272 }
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3273 };
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3274
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3275 void G1CollectedHeap::verify(bool silent, VerifyOption vo) {
8855
24ef5fb05e0f 8010463: G1: Crashes with -UseTLAB and heap verification
johnc
parents: 8853
diff changeset
3276 if (SafepointSynchronize::is_at_safepoint()) {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3277 assert(Thread::current()->is_VM_thread(),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3278 "Expected to be executed serially by the VM thread at this point");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3279
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
3280 if (!silent) { gclog_or_tty->print("Roots "); }
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3281 VerifyRootsClosure rootsCl(vo);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
3282 VerifyKlassClosure klassCl(this, &rootsCl);
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
3283 CLDToKlassAndOopClosure cldCl(&klassCl, &rootsCl, false);
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3284
3293
1f4413413144 7039089: G1: changeset for 7037276 broke heap verification, and related cleanups
ysr
parents: 3289
diff changeset
3285 // We apply the relevant closures to all the oops in the
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
3286 // system dictionary, class loader data graph, the string table
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
3287 // and the nmethods in the code cache.
20257
7426d8d76305 8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents: 20256
diff changeset
3288 G1VerifyCodeRootOopClosure codeRootsCl(this, &rootsCl, vo);
7426d8d76305 8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents: 20256
diff changeset
3289 G1VerifyCodeRootBlobClosure blobsCl(&codeRootsCl);
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
3290
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
3291 {
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
3292 G1RootProcessor root_processor(this);
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
3293 root_processor.process_all_roots(&rootsCl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
3294 &cldCl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
3295 &blobsCl);
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
3296 }
20257
7426d8d76305 8034761: Remove the do_code_roots parameter from process_strong_roots
stefank
parents: 20256
diff changeset
3297
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3298 bool failures = rootsCl.failures() || codeRootsCl.failures();
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3299
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3300 if (vo != VerifyOption_G1UseMarkWord) {
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3301 // If we're verifying during a full GC then the region sets
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3302 // will have been torn down at the start of the GC. Therefore
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3303 // verifying the region sets will fail. So we only verify
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3304 // the region sets when not in a full GC.
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3305 if (!silent) { gclog_or_tty->print("HeapRegionSets "); }
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3306 verify_region_sets();
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3307 }
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3308
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3309 if (!silent) { gclog_or_tty->print("HeapRegions "); }
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3310 if (GCParallelVerificationEnabled && ParallelGCThreads > 1) {
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3311 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3312 "sanity check");
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3313
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3314 G1ParVerifyTask task(this, vo);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3315 assert(UseDynamicNumberOfGCThreads ||
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3316 workers()->active_workers() == workers()->total_workers(),
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3317 "If not dynamic should be using all the workers");
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3318 int n_workers = workers()->active_workers();
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3319 set_par_threads(n_workers);
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3320 workers()->run_task(&task);
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3321 set_par_threads(0);
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3322 if (task.failures()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3323 failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3324 }
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3325
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3326 // Checks that the expected amount of parallel work was done.
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
3327 // The implication is that n_workers is > 0.
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3328 assert(check_heap_region_claim_values(HeapRegion::ParVerifyClaimValue),
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3329 "sanity check");
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3330
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3331 reset_heap_region_claim_values();
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3332
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3333 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3334 "sanity check");
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3335 } else {
6008
b632e80fc9dc 4988100: oop_verify_old_oop appears to be dead
brutisso
parents: 6007
diff changeset
3336 VerifyRegionClosure blk(false, vo);
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
3337 heap_region_iterate(&blk);
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3338 if (blk.failures()) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3339 failures = true;
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3340 }
390
cc68c8e9b309 6752248: G1: introduce parallel heap verification
tonyp
parents: 355
diff changeset
3341 }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3342 if (!silent) gclog_or_tty->print("RemSet ");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3343 rem_set()->verify();
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3344
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3345 if (G1StringDedup::is_enabled()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3346 if (!silent) gclog_or_tty->print("StrDedup ");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3347 G1StringDedup::verify();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3348 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3349
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3350 if (failures) {
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3351 gclog_or_tty->print_cr("Heap:");
4073
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3352 // It helps to have the per-region information in the output to
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3353 // help us track down what went wrong. This is why we call
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3354 // print_extended_on() instead of print_on().
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3355 print_extended_on(gclog_or_tty);
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
3356 gclog_or_tty->cr();
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 1545
diff changeset
3357 #ifndef PRODUCT
1044
6270f80a7331 6890137: G1: revamp reachable object dump
tonyp
parents: 1020
diff changeset
3358 if (VerifyDuringGC && G1VerifyDuringGCPrintReachable) {
1388
7666957bc44d 6937142: G1: improvements to debugging output (S-M)
tonyp
parents: 1387
diff changeset
3359 concurrent_mark()->print_reachable("at-verification-failure",
3772
6747fd0512e0 7004681: G1: Extend marking verification to Full GCs
johnc
parents: 3766
diff changeset
3360 vo, false /* all */);
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3361 }
1547
fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1
jcoomes
parents: 1545
diff changeset
3362 #endif
1020
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3363 gclog_or_tty->flush();
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3364 }
ff2402f6a50b 6882730: G1: parallel heap verification messes up region dump
tonyp
parents: 1019
diff changeset
3365 guarantee(!failures, "there should not have been any failures");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3366 } else {
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3367 if (!silent) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3368 gclog_or_tty->print("(SKIPPING Roots, HeapRegionSets, HeapRegions, RemSet");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3369 if (G1StringDedup::is_enabled()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3370 gclog_or_tty->print(", StrDedup");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3371 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3372 gclog_or_tty->print(") ");
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3373 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3374 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3375 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3376
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3377 void G1CollectedHeap::verify(bool silent) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3378 verify(silent, VerifyOption_G1UsePrevMarking);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3379 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3380
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3381 double G1CollectedHeap::verify(bool guard, const char* msg) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3382 double verify_time_ms = 0.0;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3383
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3384 if (guard && total_collections() >= VerifyGCStartAt) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3385 double verify_start = os::elapsedTime();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3386 HandleMark hm; // Discard invalid handles created during verification
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3387 prepare_for_verify();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3388 Universe::verify(VerifyOption_G1UsePrevMarking, msg);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3389 verify_time_ms = (os::elapsedTime() - verify_start) * 1000;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3390 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3391
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3392 return verify_time_ms;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3393 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3394
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3395 void G1CollectedHeap::verify_before_gc() {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3396 double verify_time_ms = verify(VerifyBeforeGC, " VerifyBeforeGC:");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3397 g1_policy()->phase_times()->record_verify_before_time_ms(verify_time_ms);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3398 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3399
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3400 void G1CollectedHeap::verify_after_gc() {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3401 double verify_time_ms = verify(VerifyAfterGC, " VerifyAfterGC:");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3402 g1_policy()->phase_times()->record_verify_after_time_ms(verify_time_ms);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3403 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
3404
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3405 class PrintRegionClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3406 outputStream* _st;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3407 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3408 PrintRegionClosure(outputStream* st) : _st(st) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3409 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3410 r->print_on(_st);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3411 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3412 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3413 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3414
17833
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3415 bool G1CollectedHeap::is_obj_dead_cond(const oop obj,
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3416 const HeapRegion* hr,
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3417 const VerifyOption vo) const {
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3418 switch (vo) {
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3419 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj, hr);
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3420 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj, hr);
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3421 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked();
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3422 default: ShouldNotReachHere();
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3423 }
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3424 return false; // keep some compilers happy
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3425 }
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3426
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3427 bool G1CollectedHeap::is_obj_dead_cond(const oop obj,
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3428 const VerifyOption vo) const {
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3429 switch (vo) {
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3430 case VerifyOption_G1UsePrevMarking: return is_obj_dead(obj);
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3431 case VerifyOption_G1UseNextMarking: return is_obj_ill(obj);
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3432 case VerifyOption_G1UseMarkWord: return !obj->is_gc_marked();
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3433 default: ShouldNotReachHere();
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3434 }
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3435 return false; // keep some compilers happy
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3436 }
bfdf528be8e8 8038498: Fix includes and C inlining after 8035330
tschatzl
parents: 17774
diff changeset
3437
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3438 void G1CollectedHeap::print_on(outputStream* st) const {
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3439 st->print(" %-20s", "garbage-first heap");
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3440 st->print(" total " SIZE_FORMAT "K, used " SIZE_FORMAT "K",
846
42d84bbbecf4 6859911: G1: assert(Heap_lock->owner() = NULL, "Should be owned on this thread's behalf")
tonyp
parents: 845
diff changeset
3441 capacity()/K, used_unlocked()/K);
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3442 st->print(" [" INTPTR_FORMAT ", " INTPTR_FORMAT ", " INTPTR_FORMAT ")",
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
3443 _hrm.reserved().start(),
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
3444 _hrm.reserved().start() + _hrm.length() + HeapRegion::GrainWords,
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
3445 _hrm.reserved().end());
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3446 st->cr();
3986
65a8ff39a6da 7095194: G1: HeapRegion::GrainBytes, GrainWords, and CardsPerRegion should be size_t
johnc
parents: 3983
diff changeset
3447 st->print(" region size " SIZE_FORMAT "K, ", HeapRegion::GrainBytes / K);
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3448 uint young_regions = _young_list->length();
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3449 st->print("%u young (" SIZE_FORMAT "K), ", young_regions,
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3450 (size_t) young_regions * HeapRegion::GrainBytes / K);
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3451 uint survivor_regions = g1_policy()->recorded_survivor_regions();
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3452 st->print("%u survivors (" SIZE_FORMAT "K)", survivor_regions,
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3453 (size_t) survivor_regions * HeapRegion::GrainBytes / K);
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3454 st->cr();
6863
04155d9c8c76 8000358: G1: metaspace information not printed in PrintHeapAtGC output nor in hs_err file
johnc
parents: 6819
diff changeset
3455 MetaspaceAux::print_on(st);
4073
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3456 }
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3457
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3458 void G1CollectedHeap::print_extended_on(outputStream* st) const {
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3459 print_on(st);
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3460
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3461 // Print the per-region information.
53074c2c4600 7099849: G1: include heap region information in hs_err files
tonyp
parents: 4072
diff changeset
3462 st->cr();
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3463 st->print_cr("Heap Regions: (Y=young(eden), SU=young(survivor), "
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3464 "HS=humongous(starts), HC=humongous(continues), "
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3465 "CS=collection set, F=free, TS=gc time stamp, "
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3466 "PTAMS=previous top-at-mark-start, "
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3467 "NTAMS=next top-at-mark-start)");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3468 PrintRegionClosure blk(st);
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
3469 heap_region_iterate(&blk);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3470 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3471
9076
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3472 void G1CollectedHeap::print_on_error(outputStream* st) const {
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3473 this->CollectedHeap::print_on_error(st);
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3474
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3475 if (_cm != NULL) {
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3476 st->cr();
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3477 _cm->print_on_error(st);
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3478 }
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3479 }
7b835924c31c 8011872: Include Bit Map addresses in the hs_err files
stefank
parents: 8855
diff changeset
3480
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3481 void G1CollectedHeap::print_gc_threads_on(outputStream* st) const {
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1755
diff changeset
3482 if (G1CollectedHeap::use_parallel_gc_threads()) {
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 993
diff changeset
3483 workers()->print_worker_threads_on(st);
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 993
diff changeset
3484 }
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 993
diff changeset
3485 _cmThread->print_on(st);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3486 st->cr();
1019
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 993
diff changeset
3487 _cm->print_worker_threads_on(st);
035d2e036a9b 6885041: G1: inconsistent thread dump
tonyp
parents: 993
diff changeset
3488 _cg1r->print_worker_threads_on(st);
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3489 if (G1StringDedup::is_enabled()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3490 G1StringDedup::print_worker_threads_on(st);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3491 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3492 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3493
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3494 void G1CollectedHeap::gc_threads_do(ThreadClosure* tc) const {
1833
8b10f48633dc 6984287: Regularize how GC parallel workers are specified.
jmasa
parents: 1755
diff changeset
3495 if (G1CollectedHeap::use_parallel_gc_threads()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3496 workers()->threads_do(tc);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3497 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3498 tc->do_thread(_cmThread);
794
315a5d70b295 6484957: G1: parallel concurrent refinement
iveresov
parents: 751
diff changeset
3499 _cg1r->threads_do(tc);
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3500 if (G1StringDedup::is_enabled()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3501 G1StringDedup::threads_do(tc);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
3502 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3503 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3504
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3505 void G1CollectedHeap::print_tracing_info() const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3506 // We'll overload this to mean "trace GC pause statistics."
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3507 if (TraceGen0Time || TraceGen1Time) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3508 // The "G1CollectorPolicy" is keeping track of these stats, so delegate
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3509 // to that.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3510 g1_policy()->print_tracing_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3511 }
751
20c6f43950b5 6490395: G1: Tidy up command line flags.
johnc
parents: 678
diff changeset
3512 if (G1SummarizeRSetStats) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3513 g1_rem_set()->print_summary_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3514 }
1282
b81f3572f355 6928059: G1: command line parameter renaming
tonyp
parents: 1261
diff changeset
3515 if (G1SummarizeConcMark) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3516 concurrent_mark()->print_summary_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3517 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3518 g1_policy()->print_yg_surv_rate_info();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3519 SpecializationStats::print();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3520 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3521
3777
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3522 #ifndef PRODUCT
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3523 // Helpful for debugging RSet issues.
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3524
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3525 class PrintRSetsClosure : public HeapRegionClosure {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3526 private:
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3527 const char* _msg;
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3528 size_t _occupied_sum;
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3529
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3530 public:
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3531 bool doHeapRegion(HeapRegion* r) {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3532 HeapRegionRemSet* hrrs = r->rem_set();
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3533 size_t occupied = hrrs->occupied();
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3534 _occupied_sum += occupied;
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3535
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3536 gclog_or_tty->print_cr("Printing RSet for region "HR_FORMAT,
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3537 HR_FORMAT_PARAMS(r));
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3538 if (occupied == 0) {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3539 gclog_or_tty->print_cr(" RSet is empty");
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3540 } else {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3541 hrrs->print();
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3542 }
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3543 gclog_or_tty->print_cr("----------");
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3544 return false;
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3545 }
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3546
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3547 PrintRSetsClosure(const char* msg) : _msg(msg), _occupied_sum(0) {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3548 gclog_or_tty->cr();
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3549 gclog_or_tty->print_cr("========================================");
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 17935
diff changeset
3550 gclog_or_tty->print_cr("%s", msg);
3777
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3551 gclog_or_tty->cr();
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3552 }
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3553
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3554 ~PrintRSetsClosure() {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3555 gclog_or_tty->print_cr("Occupied Sum: "SIZE_FORMAT, _occupied_sum);
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3556 gclog_or_tty->print_cr("========================================");
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3557 gclog_or_tty->cr();
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3558 }
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3559 };
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3560
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3561 void G1CollectedHeap::print_cset_rsets() {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3562 PrintRSetsClosure cl("Printing CSet RSets");
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3563 collection_set_iterate(&cl);
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3564 }
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3565
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3566 void G1CollectedHeap::print_all_rsets() {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3567 PrintRSetsClosure cl("Printing All RSets");;
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3568 heap_region_iterate(&cl);
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3569 }
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3570 #endif // PRODUCT
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3571
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3572 G1CollectedHeap* G1CollectedHeap::heap() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3573 assert(_sh->kind() == CollectedHeap::G1CollectedHeap,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3574 "not a garbage-first heap");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3575 return _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3576 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3577
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3578 void G1CollectedHeap::gc_prologue(bool full /* Ignored */) {
1245
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1166
diff changeset
3579 // always_do_update_barrier = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3580 assert(InlineCacheBuffer::is_empty(), "should have cleaned up ICBuffer");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3581 // Fill TLAB's and such
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
3582 accumulate_statistics_all_tlabs();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3583 ensure_parsability(true);
12339
c319b188c7b2 8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents: 12305
diff changeset
3584
c319b188c7b2 8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents: 12305
diff changeset
3585 if (G1SummarizeRSetStats && (G1SummarizeRSetStatsPeriod > 0) &&
c319b188c7b2 8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents: 12305
diff changeset
3586 (total_collections() % G1SummarizeRSetStatsPeriod == 0)) {
c319b188c7b2 8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents: 12305
diff changeset
3587 g1_rem_set()->print_periodic_summary_info("Before GC RS summary");
c319b188c7b2 8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents: 12305
diff changeset
3588 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3589 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3590
20445
e5668dcf12e9 8057818: collect allocation context statistics at gc pauses
jcoomes
parents: 20404
diff changeset
3591 void G1CollectedHeap::gc_epilogue(bool full) {
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3592
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3593 if (G1SummarizeRSetStats &&
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3594 (G1SummarizeRSetStatsPeriod > 0) &&
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3595 // we are at the end of the GC. Total collections has already been increased.
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3596 ((total_collections() - 1) % G1SummarizeRSetStatsPeriod == 0)) {
12339
c319b188c7b2 8014078: G1: improve remembered set summary information by providing per region type information
tschatzl
parents: 12305
diff changeset
3597 g1_rem_set()->print_periodic_summary_info("After GC RS summary");
10372
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3598 }
e72f7eecc96d 8013895: G1: G1SummarizeRSetStats output on Linux needs improvemen
tschatzl
parents: 10327
diff changeset
3599
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3600 // FIXME: what is this about?
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3601 // I'm ignoring the "fill_newgen()" call if "alloc_event_enabled"
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3602 // is set.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3603 COMPILER2_PRESENT(assert(DerivedPointerTable::is_empty(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3604 "derived pointer present"));
1245
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1166
diff changeset
3605 // always_do_update_barrier = true;
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
3606
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
3607 resize_all_tlabs();
20445
e5668dcf12e9 8057818: collect allocation context statistics at gc pauses
jcoomes
parents: 20404
diff changeset
3608 allocation_context_stats().update(full);
17727
cfd4aac53239 8030177: G1: Enable TLAB resizing
brutisso
parents: 17689
diff changeset
3609
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
3610 // We have just completed a GC. Update the soft reference
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
3611 // policy with the new heap occupancy
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
3612 Universe::update_heap_info_at_gc();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3613 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3614
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3615 HeapWord* G1CollectedHeap::do_collection_pause(size_t word_size,
22936
fb69749583e8 8072621: Clean up around VM_GC_Operations
mlarsson
parents: 22923
diff changeset
3616 uint gc_count_before,
12113
f7d3b4387a16 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 12082
diff changeset
3617 bool* succeeded,
f7d3b4387a16 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 12082
diff changeset
3618 GCCause::Cause gc_cause) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3619 assert_heap_not_locked_and_not_at_safepoint();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3620 g1_policy()->record_stop_world_start();
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3621 VM_G1IncCollectionPause op(gc_count_before,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3622 word_size,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3623 false, /* should_initiate_conc_mark */
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3624 g1_policy()->max_pause_time_ms(),
12113
f7d3b4387a16 8022872: G1: Use correct GC cause for young GC triggered by humongous allocations
brutisso
parents: 12082
diff changeset
3625 gc_cause);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
3626
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
3627 op.set_allocation_context(AllocationContext::current());
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3628 VMThread::execute(&op);
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3629
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3630 HeapWord* result = op.result();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3631 bool ret_succeeded = op.prologue_succeeded() && op.pause_succeeded();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3632 assert(result == NULL || ret_succeeded,
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3633 "the result should be NULL if the VM did not succeed");
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3634 *succeeded = ret_succeeded;
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3635
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3636 assert_heap_not_locked();
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3637 return result;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3638 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3639
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3640 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3641 G1CollectedHeap::doConcurrentMark() {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3642 MutexLockerEx x(CGC_lock, Mutex::_no_safepoint_check_flag);
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3643 if (!_cmThread->in_progress()) {
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3644 _cmThread->set_started();
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3645 CGC_lock->notify();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3646 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3647 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3648
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3649 size_t G1CollectedHeap::pending_card_num() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3650 size_t extra_cards = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3651 JavaThread *curr = Threads::first();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3652 while (curr != NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3653 DirtyCardQueue& dcq = curr->dirty_card_queue();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3654 extra_cards += dcq.size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3655 curr = curr->next();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3656 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3657 DirtyCardQueueSet& dcqs = JavaThread::dirty_card_queue_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3658 size_t buffer_size = dcqs.buffer_size();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3659 size_t buffer_num = dcqs.completed_buffers_num();
6611
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6610
diff changeset
3660
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6610
diff changeset
3661 // PtrQueueSet::buffer_size() and PtrQueue:size() return sizes
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6610
diff changeset
3662 // in bytes - not the number of 'entries'. We need to convert
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6610
diff changeset
3663 // into a number of cards.
7383557659bd 7185699: G1: Prediction model discrepancies
johnc
parents: 6610
diff changeset
3664 return (buffer_size * buffer_num + extra_cards) / oopSize;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3665 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3666
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3667 size_t G1CollectedHeap::cards_scanned() {
1861
c32059ef4dc0 6971296: G1: simplify G1RemSet class hierarchy
johnc
parents: 1840
diff changeset
3668 return g1_rem_set()->cardsScanned();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3669 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3670
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3671 class RegisterHumongousWithInCSetFastTestClosure : public HeapRegionClosure {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3672 private:
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3673 size_t _total_humongous;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3674 size_t _candidate_humongous;
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3675
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3676 DirtyCardQueue _dcq;
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3677
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3678 // We don't nominate objects with many remembered set entries, on
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3679 // the assumption that such objects are likely still live.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3680 bool is_remset_small(HeapRegion* region) const {
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3681 HeapRegionRemSet* const rset = region->rem_set();
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3682 return G1EagerReclaimHumongousObjectsWithStaleRefs
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3683 ? rset->occupancy_less_or_equal_than(G1RSetSparseRegionEntries)
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3684 : rset->is_empty();
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3685 }
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3686
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3687 bool is_typeArray_region(HeapRegion* region) const {
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3688 return oop(region->bottom())->is_typeArray();
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3689 }
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3690
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3691 bool humongous_region_is_candidate(G1CollectedHeap* heap, HeapRegion* region) const {
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3692 assert(region->startsHumongous(), "Must start a humongous object");
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3693
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3694 // Candidate selection must satisfy the following constraints
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3695 // while concurrent marking is in progress:
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3696 //
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3697 // * In order to maintain SATB invariants, an object must not be
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3698 // reclaimed if it was allocated before the start of marking and
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3699 // has not had its references scanned. Such an object must have
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3700 // its references (including type metadata) scanned to ensure no
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3701 // live objects are missed by the marking process. Objects
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3702 // allocated after the start of concurrent marking don't need to
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3703 // be scanned.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3704 //
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3705 // * An object must not be reclaimed if it is on the concurrent
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3706 // mark stack. Objects allocated after the start of concurrent
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3707 // marking are never pushed on the mark stack.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3708 //
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3709 // Nominating only objects allocated after the start of concurrent
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3710 // marking is sufficient to meet both constraints. This may miss
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3711 // some objects that satisfy the constraints, but the marking data
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3712 // structures don't support efficiently performing the needed
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3713 // additional tests or scrubbing of the mark stack.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3714 //
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3715 // However, we presently only nominate is_typeArray() objects.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3716 // A humongous object containing references induces remembered
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3717 // set entries on other regions. In order to reclaim such an
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3718 // object, those remembered sets would need to be cleaned up.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3719 //
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3720 // We also treat is_typeArray() objects specially, allowing them
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3721 // to be reclaimed even if allocated before the start of
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3722 // concurrent mark. For this we rely on mark stack insertion to
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3723 // exclude is_typeArray() objects, preventing reclaiming an object
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3724 // that is in the mark stack. We also rely on the metadata for
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3725 // such objects to be built-in and so ensured to be kept live.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3726 // Frequent allocation and drop of large binary blobs is an
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3727 // important use case for eager reclaim, and this special handling
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3728 // may reduce needed headroom.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3729
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3730 return is_typeArray_region(region) && is_remset_small(region);
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3731 }
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3732
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3733 public:
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3734 RegisterHumongousWithInCSetFastTestClosure()
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3735 : _total_humongous(0),
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3736 _candidate_humongous(0),
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3737 _dcq(&JavaThread::dirty_card_queue_set()) {
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3738 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3739
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3740 virtual bool doHeapRegion(HeapRegion* r) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3741 if (!r->startsHumongous()) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3742 return false;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3743 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3744 G1CollectedHeap* g1h = G1CollectedHeap::heap();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3745
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3746 bool is_candidate = humongous_region_is_candidate(g1h, r);
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3747 uint rindex = r->hrm_index();
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3748 g1h->set_humongous_reclaim_candidate(rindex, is_candidate);
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3749 if (is_candidate) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3750 _candidate_humongous++;
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3751 g1h->register_humongous_region_with_in_cset_fast_test(rindex);
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3752 // Is_candidate already filters out humongous object with large remembered sets.
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3753 // If we have a humongous object with a few remembered sets, we simply flush these
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3754 // remembered set entries into the DCQS. That will result in automatic
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3755 // re-evaluation of their remembered set entries during the following evacuation
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3756 // phase.
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3757 if (!r->rem_set()->is_empty()) {
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3758 guarantee(r->rem_set()->occupancy_less_or_equal_than(G1RSetSparseRegionEntries),
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3759 "Found a not-small remembered set here. This is inconsistent with previous assumptions.");
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3760 G1SATBCardTableLoggingModRefBS* bs = g1h->g1_barrier_set();
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3761 HeapRegionRemSetIterator hrrs(r->rem_set());
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3762 size_t card_index;
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3763 while (hrrs.has_next(card_index)) {
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3764 jbyte* card_ptr = (jbyte*)bs->byte_for_index(card_index);
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3765 if (*card_ptr != CardTableModRefBS::dirty_card_val()) {
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3766 *card_ptr = CardTableModRefBS::dirty_card_val();
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3767 _dcq.enqueue(card_ptr);
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3768 }
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3769 }
23569
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
3770 assert(hrrs.n_yielded() == r->rem_set()->occupied(),
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
3771 err_msg("Remembered set hash maps out of sync, cur: " SIZE_FORMAT " entries, next: " SIZE_FORMAT " entries",
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
3772 hrrs.n_yielded(), r->rem_set()->occupied()));
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3773 r->rem_set()->clear_locked();
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3774 }
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3775 assert(r->rem_set()->is_empty(), "At this point any humongous candidate remembered set must be empty.");
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3776 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3777 _total_humongous++;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3778
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3779 return false;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3780 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3781
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3782 size_t total_humongous() const { return _total_humongous; }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3783 size_t candidate_humongous() const { return _candidate_humongous; }
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3784
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3785 void flush_rem_set_entries() { _dcq.flush(); }
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3786 };
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3787
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3788 void G1CollectedHeap::register_humongous_regions_with_in_cset_fast_test() {
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3789 if (!G1EagerReclaimHumongousObjects) {
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3790 g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(0.0, 0, 0);
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3791 return;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3792 }
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3793 double time = os::elapsed_counter();
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3794
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
3795 // Collect reclaim candidate information and register candidates with cset.
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3796 RegisterHumongousWithInCSetFastTestClosure cl;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3797 heap_region_iterate(&cl);
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3798
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3799 time = ((double)(os::elapsed_counter() - time) / os::elapsed_frequency()) * 1000.0;
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3800 g1_policy()->phase_times()->record_fast_reclaim_humongous_stats(time,
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3801 cl.total_humongous(),
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3802 cl.candidate_humongous());
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3803 _has_humongous_reclaim_candidates = cl.candidate_humongous() > 0;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3804
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3805 // Finally flush all remembered set entries to re-check into the global DCQS.
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
3806 cl.flush_rem_set_entries();
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3807 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
3808
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3809 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3810 G1CollectedHeap::setup_surviving_young_words() {
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3811 assert(_surviving_young_words == NULL, "pre-condition");
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3812 uint array_length = g1_policy()->young_cset_region_length();
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6121
diff changeset
3813 _surviving_young_words = NEW_C_HEAP_ARRAY(size_t, (size_t) array_length, mtGC);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3814 if (_surviving_young_words == NULL) {
10161
746b070f5022 8011661: Insufficient memory message says "malloc" when sometimes it should say "mmap"
ccheung
parents: 10099
diff changeset
3815 vm_exit_out_of_memory(sizeof(size_t) * array_length, OOM_MALLOC_ERROR,
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3816 "Not enough space for young surv words summary.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3817 }
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3818 memset(_surviving_young_words, 0, (size_t) array_length * sizeof(size_t));
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3819 #ifdef ASSERT
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3820 for (uint i = 0; i < array_length; ++i) {
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3821 assert( _surviving_young_words[i] == 0, "memset above" );
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3822 }
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
3823 #endif // !ASSERT
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3824 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3825
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3826 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3827 G1CollectedHeap::update_surviving_young_words(size_t* surv_young_words) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3828 MutexLockerEx x(ParGCRareEvent_lock, Mutex::_no_safepoint_check_flag);
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3829 uint array_length = g1_policy()->young_cset_region_length();
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3830 for (uint i = 0; i < array_length; ++i) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3831 _surviving_young_words[i] += surv_young_words[i];
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
3832 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3833 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3834
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3835 void
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3836 G1CollectedHeap::cleanup_surviving_young_words() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3837 guarantee( _surviving_young_words != NULL, "pre-condition" );
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6121
diff changeset
3838 FREE_C_HEAP_ARRAY(size_t, _surviving_young_words, mtGC);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3839 _surviving_young_words = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3840 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
3841
3777
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3842 #ifdef ASSERT
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3843 class VerifyCSetClosure: public HeapRegionClosure {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3844 public:
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3845 bool doHeapRegion(HeapRegion* hr) {
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3846 // Here we check that the CSet region's RSet is ready for parallel
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3847 // iteration. The fields that we'll verify are only manipulated
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3848 // when the region is part of a CSet and is collected. Afterwards,
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3849 // we reset these fields when we clear the region's RSet (when the
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3850 // region is freed) so they are ready when the region is
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3851 // re-allocated. The only exception to this is if there's an
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3852 // evacuation failure and instead of freeing the region we leave
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3853 // it in the heap. In that case, we reset these fields during
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3854 // evacuation failure handling.
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3855 guarantee(hr->rem_set()->verify_ready_for_par_iteration(), "verification");
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3856
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3857 // Here's a good place to add any other checks we'd like to
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3858 // perform on CSet regions.
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1245
diff changeset
3859 return false;
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1245
diff changeset
3860 }
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1245
diff changeset
3861 };
3777
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
3862 #endif // ASSERT
1261
0414c1049f15 6923991: G1: improve scalability of RSet scanning
iveresov
parents: 1245
diff changeset
3863
1709
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3864 #if TASKQUEUE_STATS
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3865 void G1CollectedHeap::print_taskqueue_stats_hdr(outputStream* const st) {
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3866 st->print_raw_cr("GC Task Stats");
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3867 st->print_raw("thr "); TaskQueueStats::print_header(1, st); st->cr();
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3868 st->print_raw("--- "); TaskQueueStats::print_header(2, st); st->cr();
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3869 }
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3870
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3871 void G1CollectedHeap::print_taskqueue_stats(outputStream* const st) const {
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3872 print_taskqueue_stats_hdr(st);
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3873
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3874 TaskQueueStats totals;
1755
8e5955ddf8e4 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 1719
diff changeset
3875 const int n = workers() != NULL ? workers()->total_workers() : 1;
1709
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3876 for (int i = 0; i < n; ++i) {
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3877 st->print("%3d ", i); task_queue(i)->stats.print(st); st->cr();
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3878 totals += task_queue(i)->stats;
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3879 }
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3880 st->print_raw("tot "); totals.print(st); st->cr();
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3881
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3882 DEBUG_ONLY(totals.verify());
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3883 }
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3884
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3885 void G1CollectedHeap::reset_taskqueue_stats() {
1755
8e5955ddf8e4 6978300: G1: debug builds crash if ParallelGCThreads==0
jcoomes
parents: 1719
diff changeset
3886 const int n = workers() != NULL ? workers()->total_workers() : 1;
1709
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3887 for (int i = 0; i < n; ++i) {
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3888 task_queue(i)->stats.reset();
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3889 }
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3890 }
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3891 #endif // TASKQUEUE_STATS
5f429ee79634 6966222: G1: simplify TaskQueue overflow handling
jcoomes
parents: 1707
diff changeset
3892
6752
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3893 void G1CollectedHeap::log_gc_header() {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3894 if (!G1Log::fine()) {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3895 return;
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3896 }
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3897
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17992
diff changeset
3898 gclog_or_tty->gclog_stamp(_gc_tracer_stw->gc_id());
6752
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3899
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3900 GCCauseString gc_cause_str = GCCauseString("GC pause", gc_cause())
7455
0b54ffe4c2d3 8005672: Clean up some changes to GC logging with GCCause's
jmasa
parents: 7397
diff changeset
3901 .append(g1_policy()->gcs_are_young() ? "(young)" : "(mixed)")
6752
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3902 .append(g1_policy()->during_initial_mark_pause() ? " (initial-mark)" : "");
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3903
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3904 gclog_or_tty->print("[%s", (const char*)gc_cause_str);
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3905 }
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3906
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3907 void G1CollectedHeap::log_gc_footer(double pause_time_sec) {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3908 if (!G1Log::fine()) {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3909 return;
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3910 }
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3911
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3912 if (G1Log::finer()) {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3913 if (evacuation_failed()) {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3914 gclog_or_tty->print(" (to-space exhausted)");
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3915 }
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3916 gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec);
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3917 g1_policy()->phase_times()->note_gc_end();
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3918 g1_policy()->phase_times()->print(pause_time_sec);
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3919 g1_policy()->print_detailed_heap_transition();
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3920 } else {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3921 if (evacuation_failed()) {
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3922 gclog_or_tty->print("--");
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3923 }
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3924 g1_policy()->print_heap_transition();
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3925 gclog_or_tty->print_cr(", %3.7f secs]", pause_time_sec);
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3926 }
7207
0f80645e9c26 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 6863
diff changeset
3927 gclog_or_tty->flush();
6752
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3928 }
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3929
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3930 bool
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
3931 G1CollectedHeap::do_collection_pause_at_safepoint(double target_pause_time_ms) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3932 assert_at_safepoint(true /* should_be_vm_thread */);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3933 guarantee(!is_gc_active(), "collection is not reentrant");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3934
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1313
diff changeset
3935 if (GC_locker::check_active_before_gc()) {
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
3936 return false;
1359
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1313
diff changeset
3937 }
23b1b27ac76c 6909756: G1: guarantee(G1CollectedHeap::heap()->mark_in_progress(),"Precondition.")
tonyp
parents: 1313
diff changeset
3938
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13062
diff changeset
3939 _gc_timer_stw->register_gc_start();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3940
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3941 _gc_tracer_stw->report_gc_start(gc_cause(), _gc_timer_stw->gc_start());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3942
2125
7246a374a9f2 6458402: 3 jvmti tests fail with CMS and +ExplicitGCInvokesConcurrent
kamg
parents: 2039
diff changeset
3943 SvcGCMarker sgcm(SvcGCMarker::MINOR);
2039
7c5250dbd584 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 2038
diff changeset
3944 ResourceMark rm;
7c5250dbd584 6896624: G1: hotspot:::gc and hotspot:::mem-pool-gc probes are not fired
tonyp
parents: 2038
diff changeset
3945
4872
aa3d708d67c4 7141200: log some interesting information in ring buffers for crashes
never
parents: 4787
diff changeset
3946 print_heap_before_gc();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3947 trace_heap_before_gc(_gc_tracer_stw);
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3948
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3949 verify_region_sets_optional();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
3950 verify_dirty_young_regions();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3951
4831
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3952 // This call will decide whether this pause is an initial-mark
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3953 // pause. If it is, during_initial_mark_pause() will return true
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3954 // for the duration of this pause.
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3955 g1_policy()->decide_on_conc_mark_initiation();
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3956
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3957 // We do not allow initial-mark to be piggy-backed on a mixed GC.
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3958 assert(!g1_policy()->during_initial_mark_pause() ||
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3959 g1_policy()->gcs_are_young(), "sanity");
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3960
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3961 // We also do not allow mixed GCs during marking.
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3962 assert(!mark_in_progress() || g1_policy()->gcs_are_young(), "sanity");
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3963
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3964 // Record whether this pause is an initial mark. When the current
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3965 // thread has completed its logging output and it's safe to signal
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3966 // the CM thread, the flag's value in the policy has been reset.
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3967 bool should_start_conc_mark = g1_policy()->during_initial_mark_pause();
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3968
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
3969 // Inner scope for scope based logging, timers, and stats collection
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3970 {
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3971 EvacuationInfo evacuation_info;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3972
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
3973 if (g1_policy()->during_initial_mark_pause()) {
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
3974 // We are about to start a marking cycle, so we increment the
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
3975 // full collection counter.
6120
37552638d24a 7172388: G1: _total_full_collections should not be incremented for concurrent cycles
brutisso
parents: 6109
diff changeset
3976 increment_old_marking_cycles_started();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3977 register_concurrent_cycle_start(_gc_timer_stw->gc_start());
1656
4e5661ba9d98 6944166: G1: explicit GCs are not always handled correctly
tonyp
parents: 1611
diff changeset
3978 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3979
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3980 _gc_tracer_stw->report_yc_type(yc_type());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
3981
6007
5c86f8211d1e 7160728: Introduce an extra logging level for G1 logging
brutisso
parents: 5987
diff changeset
3982 TraceCPUTime tcpu(G1Log::finer(), true, gclog_or_tty);
6030
48fac5d60c3c 7163848: G1: Log GC Cause for a GC
brutisso
parents: 6027
diff changeset
3983
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
3984 uint active_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
3985 workers()->active_workers() : 1);
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
3986 double pause_start_sec = os::elapsedTime();
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
3987 g1_policy()->phase_times()->note_gc_start(active_workers, mark_in_progress());
6752
9646b7ff4d14 7198130: G1: PrintReferenceGC output comes out of order
brutisso
parents: 6725
diff changeset
3988 log_gc_header();
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
3989
3289
b52782ae3880 6946417: G1: Java VisualVM does not support G1 properly.
jmasa
parents: 3285
diff changeset
3990 TraceCollectorStats tcs(g1mm()->incremental_collection_counters());
3356
78542e2b5e35 7036199: Adding a notification to the implementation of GarbageCollectorMXBeans
fparain
parents: 3323
diff changeset
3991 TraceMemoryManagerStats tms(false /* fullGC */, gc_cause());
1089
db0d5eba9d20 6815790: G1: Missing MemoryPoolMXBeans with -XX:+UseG1GC
tonyp
parents: 1088
diff changeset
3992
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
3993 // If the secondary_free_list is not empty, append it to the
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
3994 // free_list. No need to wait for the cleanup operation to finish;
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
3995 // the region allocation code will check the secondary_free_list
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
3996 // and wait if necessary. If the G1StressConcRegionFreeing flag is
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
3997 // set, skip this step so that the region allocation code has to
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
3998 // get entries from the secondary_free_list.
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
3999 if (!G1StressConcRegionFreeing) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
4000 append_secondary_free_list_if_not_empty_with_lock();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
4001 }
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4002
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
4003 assert(check_young_list_well_formed(), "young list should be well formed");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
4004 assert(check_heap_region_claim_values(HeapRegion::InitialClaimValue),
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
4005 "sanity check");
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4006
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4007 // Don't dynamically change the number of GC threads this early. A value of
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4008 // 0 is used to indicate serial work. When parallel work is done,
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4009 // it will be set.
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4010
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4011 { // Call to jvmpi::post_class_unload_events must occur outside of active GC
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4012 IsGCActiveMark x;
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4013
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4014 gc_prologue(false);
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4015 increment_total_collections(false /* full gc */);
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
4016 increment_gc_time_stamp();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4017
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
4018 verify_before_gc();
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
4019 check_bitmaps("GC Start");
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4020
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4021 COMPILER2_PRESENT(DerivedPointerTable::clear());
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4022
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4023 // Please see comment in g1CollectedHeap.hpp and
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4024 // G1CollectedHeap::ref_processing_init() to see how
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4025 // reference processing currently works in G1.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4026
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4027 // Enable discovery in the STW reference processor
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4028 ref_processor_stw()->enable_discovery(true /*verify_disabled*/,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4029 true /*verify_no_refs*/);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4030
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4031 {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4032 // We want to temporarily turn off discovery by the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4033 // CM ref processor, if necessary, and turn it back on
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4034 // on again later if we do. Using a scoped
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4035 // NoRefDiscovery object will do this.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4036 NoRefDiscovery no_cm_discovery(ref_processor_cm());
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4037
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4038 // Forget the current alloc region (we might even choose it to be part
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4039 // of the collection set!).
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
4040 _allocator->release_mutator_alloc_region();
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4041
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4042 // We should call this after we retire the mutator alloc
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4043 // region(s) so that all the ALLOC / RETIRE events are generated
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4044 // before the start GC event.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4045 _hr_printer.start_gc(false /* full */, (size_t) total_collections());
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4046
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4047 // This timing is only used by the ergonomics to handle our pause target.
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4048 // It is unclear why this should not include the full pause. We will
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4049 // investigate this in CR 7178365.
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4050 //
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4051 // Preserving the old comment here if that helps the investigation:
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4052 //
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4053 // The elapsed time induced by the start time below deliberately elides
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4054 // the possible verification above.
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4055 double sample_start_time_sec = os::elapsedTime();
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4056
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4057 #if YOUNG_LIST_VERBOSE
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4058 gclog_or_tty->print_cr("\nBefore recording pause start.\nYoung_list:");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4059 _young_list->print();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4060 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4061 #endif // YOUNG_LIST_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4062
10098
71013d764f6e 8010780: G1: Eden occupancy/capacity output wrong after a full GC
johnc
parents: 8855
diff changeset
4063 g1_policy()->record_collection_pause_start(sample_start_time_sec);
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4064
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4065 double scan_wait_start = os::elapsedTime();
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4066 // We have to wait until the CM threads finish scanning the
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4067 // root regions as it's the only way to ensure that all the
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4068 // objects on them have been correctly scanned before we start
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4069 // moving them during the GC.
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4070 bool waited = _cm->root_regions()->wait_until_scan_finished();
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4071 double wait_time_ms = 0.0;
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4072 if (waited) {
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4073 double scan_wait_end = os::elapsedTime();
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4074 wait_time_ms = (scan_wait_end - scan_wait_start) * 1000.0;
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4075 }
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4076 g1_policy()->phase_times()->record_root_region_scan_wait_time(wait_time_ms);
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4077
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4078 #if YOUNG_LIST_VERBOSE
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4079 gclog_or_tty->print_cr("\nAfter recording pause start.\nYoung_list:");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4080 _young_list->print();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4081 #endif // YOUNG_LIST_VERBOSE
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4082
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4083 if (g1_policy()->during_initial_mark_pause()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4084 concurrent_mark()->checkpointRootsInitialPre();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4085 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4086
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4087 #if YOUNG_LIST_VERBOSE
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4088 gclog_or_tty->print_cr("\nBefore choosing collection set.\nYoung_list:");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4089 _young_list->print();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4090 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4091 #endif // YOUNG_LIST_VERBOSE
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4092
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4093 g1_policy()->finalize_cset(target_pause_time_ms, evacuation_info);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4094
23569
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4095 // Make sure the remembered sets are up to date. This needs to be
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4096 // done before register_humongous_regions_with_cset(), because the
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4097 // remembered sets are used there to choose eager reclaim candidates.
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4098 // If the remembered sets are not up to date we might miss some
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4099 // entries that need to be handled.
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4100 g1_rem_set()->cleanupHRRS();
f3f2f71d2dc8 8139424: SIGSEGV, Problematic frame: # V [libjvm.so+0xd0c0cc] void InstanceKlass::oop_oop_iterate_oop_maps_specialized<true,oopDesc*,MarkAndPushClosure>
dbuck
parents: 23472
diff changeset
4101
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4102 register_humongous_regions_with_in_cset_fast_test();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4103
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
4104 assert(check_cset_fast_test(), "Inconsistency in the InCSetState table.");
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
4105
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4106 _cm->note_start_of_gc();
23029
0f8f1250fed5 8078023: verify_no_cset_oops found reclaimed humongous object in SATB buffer
kbarrett
parents: 23026
diff changeset
4107 // We call this after finalize_cset() to
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4108 // ensure that the CSet has been finalized.
23029
0f8f1250fed5 8078023: verify_no_cset_oops found reclaimed humongous object in SATB buffer
kbarrett
parents: 23026
diff changeset
4109 _cm->verify_no_cset_oops();
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4110
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4111 if (_hr_printer.is_active()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4112 HeapRegion* hr = g1_policy()->collection_set();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4113 while (hr != NULL) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4114 _hr_printer.cset(hr);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4115 hr = hr->next_in_collection_set();
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4116 }
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4117 }
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4118
3777
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
4119 #ifdef ASSERT
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4120 VerifyCSetClosure cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4121 collection_set_iterate(&cl);
3777
e8b0b0392037 7046182: G1: remove unnecessary iterations over the collection set
tonyp
parents: 3774
diff changeset
4122 #endif // ASSERT
1707
0ce1569c90e5 6963209: G1: remove the concept of abandoned pauses
tonyp
parents: 1705
diff changeset
4123
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4124 setup_surviving_young_words();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4125
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4126 // Initialize the GC alloc regions.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
4127 _allocator->init_gc_alloc_regions(evacuation_info);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4128
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4129 // Actually do the work...
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4130 evacuate_collection_set(evacuation_info);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4131
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4132 free_collection_set(g1_policy()->collection_set(), evacuation_info);
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4133
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4134 eagerly_reclaim_humongous_regions();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4135
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4136 g1_policy()->clear_collection_set();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4137
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4138 cleanup_surviving_young_words();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4139
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4140 // Start a new incremental collection set for the next pause.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4141 g1_policy()->start_incremental_cset_building();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4142
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4143 clear_cset_fast_test();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4144
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4145 _young_list->reset_sampled_info();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4146
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4147 // Don't check the whole heap at this point as the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4148 // GC alloc regions from this pause have been tagged
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4149 // as survivors and moved on to the survivor list.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4150 // Survivor regions will fail the !is_young() check.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4151 assert(check_young_list_empty(false /* check_heap */),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4152 "young list should be empty");
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4153
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4154 #if YOUNG_LIST_VERBOSE
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4155 gclog_or_tty->print_cr("Before recording survivors.\nYoung List:");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4156 _young_list->print();
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4157 #endif // YOUNG_LIST_VERBOSE
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4158
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4159 g1_policy()->record_survivor_regions(_young_list->survivor_length(),
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4160 _young_list->first_survivor_region(),
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4161 _young_list->last_survivor_region());
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4162
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4163 _young_list->reset_auxilary_lists();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4164
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4165 if (evacuation_failed()) {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
4166 _allocator->set_used(recalculate_used());
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4167 uint n_queues = MAX2((int)ParallelGCThreads, 1);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4168 for (uint i = 0; i < n_queues; i++) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4169 if (_evacuation_failed_info_array[i].has_failed()) {
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4170 _gc_tracer_stw->report_evacuation_failed(_evacuation_failed_info_array[i]);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4171 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4172 }
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4173 } else {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4174 // The "used" of the the collection set have already been subtracted
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4175 // when they were freed. Add in the bytes evacuated.
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
4176 _allocator->increase_used(g1_policy()->bytes_copied_during_gc());
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4177 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4178
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4179 if (g1_policy()->during_initial_mark_pause()) {
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4180 // We have to do this before we notify the CM threads that
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4181 // they can start working to make sure that all the
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
4182 // appropriate initialization is done on the CM object.
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4183 concurrent_mark()->checkpointRootsInitialPost();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4184 set_marking_started();
4831
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4185 // Note that we don't actually trigger the CM thread at
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4186 // this point. We do that later when we're sure that
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4187 // the current thread has completed its logging output.
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4188 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4189
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4190 allocate_dummy_regions();
3285
49a67202bc67 7011855: G1: non-product flag to artificially grow the heap
tonyp
parents: 2433
diff changeset
4191
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4192 #if YOUNG_LIST_VERBOSE
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4193 gclog_or_tty->print_cr("\nEnd of the pause.\nYoung_list:");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4194 _young_list->print();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4195 g1_policy()->print_collection_set(g1_policy()->inc_cset_head(), gclog_or_tty);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
4196 #endif // YOUNG_LIST_VERBOSE
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4197
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
4198 _allocator->init_mutator_alloc_region();
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4199
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4200 {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4201 size_t expand_bytes = g1_policy()->expansion_amount();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4202 if (expand_bytes > 0) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4203 size_t bytes_before = capacity();
4785
97c00e21fecb 7125281: G1: heap expansion code is replicated
tonyp
parents: 4784
diff changeset
4204 // No need for an ergo verbose message here,
97c00e21fecb 7125281: G1: heap expansion code is replicated
tonyp
parents: 4784
diff changeset
4205 // expansion_amount() does this when it returns a value > 0.
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4206 if (!expand(expand_bytes)) {
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
4207 // We failed to expand the heap. Cannot do anything about it.
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4208 }
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
4209 }
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
4210 }
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4211
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4212 // We redo the verification but now wrt to the new CSet which
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4213 // has just got initialized after the previous CSet was freed.
23029
0f8f1250fed5 8078023: verify_no_cset_oops found reclaimed humongous object in SATB buffer
kbarrett
parents: 23026
diff changeset
4214 _cm->verify_no_cset_oops();
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4215 _cm->note_end_of_gc();
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4216
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4217 // This timing is only used by the ergonomics to handle our pause target.
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4218 // It is unclear why this should not include the full pause. We will
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4219 // investigate this in CR 7178365.
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4220 double sample_end_time_sec = os::elapsedTime();
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4221 double pause_time_ms = (sample_end_time_sec - sample_start_time_sec) * MILLIUNITS;
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4222 g1_policy()->record_collection_pause_end(pause_time_ms, evacuation_info);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4223
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4224 MemoryService::track_memory_usage();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4225
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4226 // In prepare_for_verify() below we'll need to scan the deferred
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4227 // update buffers to bring the RSets up-to-date if
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4228 // G1HRRSFlushLogBuffersOnVerify has been set. While scanning
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4229 // the update buffers we'll probably need to scan cards on the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4230 // regions we just allocated to (i.e., the GC alloc
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4231 // regions). However, during the last GC we called
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4232 // set_saved_mark() on all the GC alloc regions, so card
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4233 // scanning might skip the [saved_mark_word()...top()] area of
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4234 // those regions (i.e., the area we allocated objects into
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4235 // during the last GC). But it shouldn't. Given that
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4236 // saved_mark_word() is conditional on whether the GC time stamp
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4237 // on the region is current or not, by incrementing the GC time
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4238 // stamp here we invalidate all the GC time stamps on all the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4239 // regions and saved_mark_word() will simply return top() for
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4240 // all the regions. This is a nicer way of ensuring this rather
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4241 // than iterating over the regions and fixing them. In fact, the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4242 // GC time stamp increment here also ensures that
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4243 // saved_mark_word() will return top() between pauses, i.e.,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4244 // during concurrent refinement. So we don't need the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4245 // is_gc_active() check to decided which top to use when
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4246 // scanning cards (see CR 7039627).
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4247 increment_gc_time_stamp();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4248
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
4249 verify_after_gc();
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
4250 check_bitmaps("GC End");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4251
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4252 assert(!ref_processor_stw()->discovery_enabled(), "Postcondition");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4253 ref_processor_stw()->verify_no_references_recorded();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4254
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
4255 // CM reference discovery will be re-enabled if necessary.
3920
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
4256 }
af2ab04e0038 6929868: G1: introduce min / max young gen size bounds
brutisso
parents: 3919
diff changeset
4257
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4258 // We should do this after we potentially expand the heap so
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4259 // that all the COMMIT events are generated before the end GC
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4260 // event, and after we retire the GC alloc regions so that all
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4261 // RETIRE events are generated before the end GC event.
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4262 _hr_printer.end_gc(false /* full */, (size_t) total_collections());
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4263
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 545
diff changeset
4264 #ifdef TRACESPINNING
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4265 ParallelTaskTerminator::print_termination_counts();
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 545
diff changeset
4266 #endif
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4267
838
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4268 gc_epilogue(false);
0316eac49d5a 6855834: G1: minimize the output when -XX:+PrintHeapAtGC is set
tonyp
parents: 811
diff changeset
4269 }
6121
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4270
7207
0f80645e9c26 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 6863
diff changeset
4271 // Print the remainder of the GC log output.
0f80645e9c26 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 6863
diff changeset
4272 log_gc_footer(os::elapsedTime() - pause_start_sec);
0f80645e9c26 8004170: G1: Verbose GC output is not getting flushed to log file using JDK 8
johnc
parents: 6863
diff changeset
4273
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
4274 // It is not yet to safe to tell the concurrent mark to
6121
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4275 // start as we have some optional output below. We don't want the
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4276 // output from the concurrent mark thread interfering with this
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4277 // logging output either.
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4278
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
4279 _hrm.verify_optional();
6121
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4280 verify_region_sets_optional();
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4281
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4282 TASKQUEUE_STATS_ONLY(if (ParallelGCVerbose) print_taskqueue_stats());
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4283 TASKQUEUE_STATS_ONLY(reset_taskqueue_stats());
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4284
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4285 print_heap_after_gc();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4286 trace_heap_after_gc(_gc_tracer_stw);
6121
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4287
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4288 // We must call G1MonitoringSupport::update_sizes() in the same scoping level
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4289 // as an active TraceMemoryManagerStats object (i.e. before the destructor for the
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4290 // TraceMemoryManagerStats is called) so that the G1 memory pools are updated
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4291 // before any GC notifications are raised.
b9442ac22f59 7173460: G1: java/lang/management/MemoryMXBean/CollectionUsageThreshold.java failes with G1
brutisso
parents: 6120
diff changeset
4292 g1mm()->update_sizes();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4293
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4294 _gc_tracer_stw->report_evacuation_info(&evacuation_info);
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4295 _gc_tracer_stw->report_tenuring_threshold(_g1_policy->tenuring_threshold());
13400
86e6d691f2e1 8028128: Add a type safe alternative for working with counter based data
mgronlun
parents: 13062
diff changeset
4296 _gc_timer_stw->register_gc_end();
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4297 _gc_tracer_stw->report_gc_end(_gc_timer_stw->gc_end(), _gc_timer_stw->time_partitions());
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4298 }
4831
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4299 // It should now be safe to tell the concurrent mark thread to start
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4300 // without its logging output interfering with the logging output
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4301 // that came from the pause.
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4302
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4303 if (should_start_conc_mark) {
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4304 // CAUTION: after the doConcurrentMark() call below,
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4305 // the concurrent marking thread(s) could be running
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4306 // concurrently with us. Make sure that anything after
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4307 // this point does not assume that we are the only GC thread
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4308 // running. Note: of course, the actual marking work will
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4309 // not start until the safepoint itself is released in
20192
581e70386ec9 8039147: Cleanup SuspendibleThreadSet
pliden
parents: 20191
diff changeset
4310 // SuspendibleThreadSet::desynchronize().
4831
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4311 doConcurrentMark();
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4312 }
7ca7be5a6a0b 7129271: G1: Interference from multiple threads in PrintGC/PrintGCDetails output
johnc
parents: 4829
diff changeset
4313
1973
631f79e71e90 6974966: G1: unnecessary direct-to-old allocations
tonyp
parents: 1972
diff changeset
4314 return true;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4315 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4316
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4317 void G1CollectedHeap::init_for_evac_failure(OopsInHeapRegionClosure* cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4318 _drain_in_progress = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4319 set_evac_failure_closure(cl);
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6121
diff changeset
4320 _evac_failure_scan_stack = new (ResourceObj::C_HEAP, mtGC) GrowableArray<oop>(40, true);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4321 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4322
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4323 void G1CollectedHeap::finalize_for_evac_failure() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4324 assert(_evac_failure_scan_stack != NULL &&
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4325 _evac_failure_scan_stack->length() == 0,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4326 "Postcondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4327 assert(!_drain_in_progress, "Postcondition");
1045
fa2f65ebeb08 6870843: G1: G1 GC memory leak
apetrusenko
parents: 1044
diff changeset
4328 delete _evac_failure_scan_stack;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4329 _evac_failure_scan_stack = NULL;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4330 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4331
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4332 void G1CollectedHeap::remove_self_forwarding_pointers() {
4783
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4333 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4334
17757
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
4335 double remove_self_forwards_start = os::elapsedTime();
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
4336
4783
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4337 G1ParRemoveSelfForwardPtrsTask rsfp_task(this);
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4338
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4339 if (G1CollectedHeap::use_parallel_gc_threads()) {
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4340 set_par_threads();
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4341 workers()->run_task(&rsfp_task);
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4342 set_par_threads(0);
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 595
diff changeset
4343 } else {
4783
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4344 rsfp_task.work(0);
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4345 }
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4346
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4347 assert(check_cset_heap_region_claim_values(HeapRegion::ParEvacFailureClaimValue), "sanity");
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4348
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4349 // Reset the claim values in the regions in the collection set.
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4350 reset_cset_heap_region_claim_values();
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4351
023652e49ac0 7121496: G1: do the per-region evacuation failure handling work in parallel
johnc
parents: 4781
diff changeset
4352 assert(check_cset_heap_region_claim_values(HeapRegion::InitialClaimValue), "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4353
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4354 // Now restore saved marks, if any.
8038
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4355 assert(_objs_with_preserved_marks.size() ==
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4356 _preserved_marks_of_objs.size(), "Both or none.");
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4357 while (!_objs_with_preserved_marks.is_empty()) {
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4358 oop obj = _objs_with_preserved_marks.pop();
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4359 markOop m = _preserved_marks_of_objs.pop();
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4360 obj->set_mark(m);
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4361 }
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4362 _objs_with_preserved_marks.clear(true);
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4363 _preserved_marks_of_objs.clear(true);
17757
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
4364
eff02b5bd56c 8035654: Add times for evacuation failure handling in "Other" time
tschatzl
parents: 17756
diff changeset
4365 g1_policy()->phase_times()->record_evac_fail_remove_self_forwards((os::elapsedTime() - remove_self_forwards_start) * 1000.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4366 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4367
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4368 void G1CollectedHeap::push_on_evac_failure_scan_stack(oop obj) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4369 _evac_failure_scan_stack->push(obj);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4370 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4371
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4372 void G1CollectedHeap::drain_evac_failure_scan_stack() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4373 assert(_evac_failure_scan_stack != NULL, "precondition");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4374
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4375 while (_evac_failure_scan_stack->length() > 0) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4376 oop obj = _evac_failure_scan_stack->pop();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4377 _evac_failure_closure->set_region(heap_region_containing(obj));
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4378 obj->oop_iterate_backwards(_evac_failure_closure);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4379 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4380 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4381
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4382 oop
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4383 G1CollectedHeap::handle_evacuation_failure_par(G1ParScanThreadState* _par_scan_state,
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4384 oop old) {
3323
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4385 assert(obj_in_cs(old),
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4386 err_msg("obj: "PTR_FORMAT" should still be in the CSet",
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4387 (HeapWord*) old));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4388 markOop m = old->mark();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4389 oop forward_ptr = old->forward_to_atomic(old);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4390 if (forward_ptr == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4391 // Forward-to-self succeeded.
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4392 assert(_par_scan_state != NULL, "par scan state");
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4393 OopsInHeapRegionClosure* cl = _par_scan_state->evac_failure_closure();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4394 uint queue_num = _par_scan_state->queue_num();
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4395
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4396 _evacuation_failed = true;
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
4397 _evacuation_failed_info_array[queue_num].register_copy_failure(old->size());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4398 if (_evac_failure_closure != cl) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4399 MutexLockerEx x(EvacFailureStack_lock, Mutex::_no_safepoint_check_flag);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4400 assert(!_drain_in_progress,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4401 "Should only be true while someone holds the lock.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4402 // Set the global evac-failure closure to the current thread's.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4403 assert(_evac_failure_closure == NULL, "Or locking has failed.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4404 set_evac_failure_closure(cl);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4405 // Now do the common part.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4406 handle_evacuation_failure_common(old, m);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4407 // Reset to NULL.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4408 set_evac_failure_closure(NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4409 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4410 // The lock is already held, and this is recursive.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4411 assert(_drain_in_progress, "This should only be the recursive case.");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4412 handle_evacuation_failure_common(old, m);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4413 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4414 return old;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4415 } else {
3323
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4416 // Forward-to-self failed. Either someone else managed to allocate
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4417 // space for this object (old != forward_ptr) or they beat us in
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4418 // self-forwarding it (old == forward_ptr).
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4419 assert(old == forward_ptr || !obj_in_cs(forward_ptr),
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4420 err_msg("obj: "PTR_FORMAT" forwarded to: "PTR_FORMAT" "
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4421 "should not be in the CSet",
75af3e8de182 7040450: G1: assert((_g1->evacuation_failed()) || (!_g1->obj_in_cs(obj))) failed: shouldn't still be in ...
tonyp
parents: 3317
diff changeset
4422 (HeapWord*) old, (HeapWord*) forward_ptr));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4423 return forward_ptr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4424 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4425 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4426
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4427 void G1CollectedHeap::handle_evacuation_failure_common(oop old, markOop m) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4428 preserve_mark_if_necessary(old, m);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4429
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4430 HeapRegion* r = heap_region_containing(old);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4431 if (!r->evacuation_failed()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4432 r->set_evacuation_failed(true);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
4433 _hr_printer.evac_failure(r);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4434 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4435
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4436 push_on_evac_failure_scan_stack(old);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4437
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4438 if (!_drain_in_progress) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4439 // prevent recursion in copy_to_survivor_space()
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4440 _drain_in_progress = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4441 drain_evac_failure_scan_stack();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4442 _drain_in_progress = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4443 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4444 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4445
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4446 void G1CollectedHeap::preserve_mark_if_necessary(oop obj, markOop m) {
2038
74ee0db180fa 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 2037
diff changeset
4447 assert(evacuation_failed(), "Oversaving!");
74ee0db180fa 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 2037
diff changeset
4448 // We want to call the "for_promotion_failure" version only in the
74ee0db180fa 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 2037
diff changeset
4449 // case of a promotion failure.
74ee0db180fa 6807801: CMS: could save/restore fewer header words during scavenge
ysr
parents: 2037
diff changeset
4450 if (m->must_be_preserved_for_promotion_failure(obj)) {
8038
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4451 _objs_with_preserved_marks.push(obj);
ad747ee9d0b1 8002144: G1: large number of evacuation failures may lead to large c heap memory usage
brutisso
parents: 7455
diff changeset
4452 _preserved_marks_of_objs.push(m);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4453 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4454 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4455
17687
86b64209f715 8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents: 17652
diff changeset
4456 void G1ParCopyHelper::mark_object(oop obj) {
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
4457 assert(!_g1->heap_region_containing(obj)->in_collection_set(), "should not mark objects in the CSet");
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4458
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4459 // We know that the object is not moving so it's safe to read its size.
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4834
diff changeset
4460 _cm->grayRoot(obj, (size_t) obj->size(), _worker_id);
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4461 }
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4462
17687
86b64209f715 8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents: 17652
diff changeset
4463 void G1ParCopyHelper::mark_forwarded_object(oop from_obj, oop to_obj) {
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4464 assert(from_obj->is_forwarded(), "from obj should be forwarded");
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4465 assert(from_obj->forwardee() == to_obj, "to obj should be the forwardee");
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4466 assert(from_obj != to_obj, "should not be self-forwarded");
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4467
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
4468 assert(_g1->heap_region_containing(from_obj)->in_collection_set(), "from obj should be in the CSet");
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
4469 assert(!_g1->heap_region_containing(to_obj)->in_collection_set(), "should not mark objects in the CSet");
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4470
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4471 // The object might be in the process of being copied by another
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4472 // worker so we cannot trust that its to-space image is
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4473 // well-formed. So we have to read its size from its from-space
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4474 // image which we know should not be changing.
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4834
diff changeset
4475 _cm->grayRoot(to_obj, (size_t) from_obj->size(), _worker_id);
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4476 }
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4477
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4478 template <class T>
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4479 void G1ParCopyHelper::do_klass_barrier(T* p, oop new_obj) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4480 if (_g1->heap_region_containing_raw(new_obj)->is_young()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4481 _scanned_klass->record_modified_oops();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4482 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4483 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4484
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4485 template <G1Barrier barrier, G1Mark do_mark_object>
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
4486 template <class T>
17687
86b64209f715 8027559: Decrease code size and templatizing in G1ParCopyClosure::do_oop_work
tschatzl
parents: 17652
diff changeset
4487 void G1ParCopyClosure<barrier, do_mark_object>::do_oop_work(T* p) {
17688
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4488 T heap_oop = oopDesc::load_heap_oop(p);
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4489
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4490 if (oopDesc::is_null(heap_oop)) {
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4491 return;
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4492 }
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4493
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4494 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
3886
eeae91c9baba 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 3869
diff changeset
4495
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4834
diff changeset
4496 assert(_worker_id == _par_scan_state->queue_num(), "sanity");
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4834
diff changeset
4497
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
4498 const InCSetState state = _g1->in_cset_state(obj);
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
4499 if (state.is_in_cset()) {
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4500 oop forwardee;
22895
f2e3f0e1f97d 8064473: Improved handling of age during object copy in G1
sfriberg
parents: 22894
diff changeset
4501 markOop m = obj->mark();
f2e3f0e1f97d 8064473: Improved handling of age during object copy in G1
sfriberg
parents: 22894
diff changeset
4502 if (m->is_marked()) {
f2e3f0e1f97d 8064473: Improved handling of age during object copy in G1
sfriberg
parents: 22894
diff changeset
4503 forwardee = (oop) m->decode_pointer();
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 488
diff changeset
4504 } else {
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
4505 forwardee = _par_scan_state->copy_to_survivor_space(state, obj, m);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4506 }
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4507 assert(forwardee != NULL, "forwardee should not be NULL");
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4508 oopDesc::encode_store_heap_oop(p, forwardee);
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4509 if (do_mark_object != G1MarkNone && forwardee != obj) {
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4510 // If the object is self-forwarded we don't need to explicitly
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4511 // mark it, the evacuation failure protocol will do so.
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4512 mark_forwarded_object(obj, forwardee);
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4513 }
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4514
17636
889068b9a088 8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents: 17634
diff changeset
4515 if (barrier == G1BarrierKlass) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4516 do_klass_barrier(p, forwardee);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4517 }
3886
eeae91c9baba 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 3869
diff changeset
4518 } else {
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
4519 if (state.is_humongous()) {
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4520 _g1->set_humongous_is_live(obj);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
4521 }
3886
eeae91c9baba 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 3869
diff changeset
4522 // The object is not in collection set. If we're a root scanning
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4523 // closure during an initial mark pause then attempt to mark the object.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4524 if (do_mark_object == G1MarkFromRoot) {
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
4525 mark_object(obj);
3886
eeae91c9baba 7080389: G1: refactor marking code in evacuation pause copy closures
johnc
parents: 3869
diff changeset
4526 }
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 488
diff changeset
4527 }
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 488
diff changeset
4528
17688
2c2ae9e5f65d 8035326: Assume non-NULL references in G1CollectedHeap::in_cset_fast_test
tschatzl
parents: 17687
diff changeset
4529 if (barrier == G1BarrierEvac) {
4836
d30fa85f9994 6484965: G1: piggy-back liveness accounting phase on marking
johnc
parents: 4834
diff changeset
4530 _par_scan_state->update_rs(_from, p, _worker_id);
526
818efdefcc99 6484956: G1: improve evacuation pause efficiency
tonyp
parents: 488
diff changeset
4531 }
17636
889068b9a088 8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents: 17634
diff changeset
4532 }
889068b9a088 8027746: Remove do_gen_barrier template parameter in G1ParCopyClosure
tschatzl
parents: 17634
diff changeset
4533
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4534 template void G1ParCopyClosure<G1BarrierEvac, G1MarkNone>::do_oop_work(oop* p);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4535 template void G1ParCopyClosure<G1BarrierEvac, G1MarkNone>::do_oop_work(narrowOop* p);
845
df6caf649ff7 6700789: G1: Enable use of compressed oops with G1 heaps
ysr
parents: 838
diff changeset
4536
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4537 class G1ParEvacuateFollowersClosure : public VoidClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4538 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4539 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4540 G1ParScanThreadState* _par_scan_state;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4541 RefToScanQueueSet* _queues;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4542 ParallelTaskTerminator* _terminator;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4543
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4544 G1ParScanThreadState* par_scan_state() { return _par_scan_state; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4545 RefToScanQueueSet* queues() { return _queues; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4546 ParallelTaskTerminator* terminator() { return _terminator; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4547
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4548 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4549 G1ParEvacuateFollowersClosure(G1CollectedHeap* g1h,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4550 G1ParScanThreadState* par_scan_state,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4551 RefToScanQueueSet* queues,
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4552 ParallelTaskTerminator* terminator)
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4553 : _g1h(g1h), _par_scan_state(par_scan_state),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4554 _queues(queues), _terminator(terminator) {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4555
1862
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4556 void do_void();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4557
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4558 private:
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4559 inline bool offer_termination();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4560 };
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4561
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4562 bool G1ParEvacuateFollowersClosure::offer_termination() {
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4563 G1ParScanThreadState* const pss = par_scan_state();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4564 pss->start_term_time();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4565 const bool res = terminator()->offer_termination();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4566 pss->end_term_time();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4567 return res;
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4568 }
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4569
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4570 void G1ParEvacuateFollowersClosure::do_void() {
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4571 G1ParScanThreadState* const pss = par_scan_state();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4572 pss->trim_queue();
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4573 do {
20224
a2328cbebb23 8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents: 20223
diff changeset
4574 pss->steal_and_trim_queue(queues());
1862
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4575 } while (!offer_termination());
b14ec34b1e07 6989448: G1: refactor and simplify G1ParScanThreadState
jcoomes
parents: 1861
diff changeset
4576 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4577
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4578 class G1KlassScanClosure : public KlassClosure {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4579 G1ParCopyHelper* _closure;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4580 bool _process_only_dirty;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4581 int _count;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4582 public:
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4583 G1KlassScanClosure(G1ParCopyHelper* closure, bool process_only_dirty)
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4584 : _process_only_dirty(process_only_dirty), _closure(closure), _count(0) {}
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4585 void do_klass(Klass* klass) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4586 // If the klass has not been dirtied we know that there's
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4587 // no references into the young gen and we can skip it.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4588 if (!_process_only_dirty || klass->has_modified_oops()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4589 // Clean the klass since we're going to scavenge all the metadata.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4590 klass->clear_modified_oops();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4591
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4592 // Tell the closure that this klass is the Klass to scavenge
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4593 // and is the one to dirty if oops are left pointing into the young gen.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4594 _closure->set_scanned_klass(klass);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4595
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4596 klass->oops_do(_closure);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4597
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4598 _closure->set_scanned_klass(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4599 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4600 _count++;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4601 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4602 };
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
4603
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4604 class G1ParTask : public AbstractGangTask {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4605 protected:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4606 G1CollectedHeap* _g1h;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4607 RefToScanQueueSet *_queues;
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4608 G1RootProcessor* _root_processor;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4609 ParallelTaskTerminator _terminator;
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
4610 uint _n_workers;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4611
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4612 Mutex _stats_lock;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4613 Mutex* stats_lock() { return &_stats_lock; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4614
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4615 public:
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4616 G1ParTask(G1CollectedHeap* g1h, RefToScanQueueSet *task_queues, G1RootProcessor* root_processor)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4617 : AbstractGangTask("G1 collection"),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4618 _g1h(g1h),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4619 _queues(task_queues),
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4620 _root_processor(root_processor),
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4621 _terminator(0, _queues),
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4622 _stats_lock(Mutex::leaf, "parallel G1 stats lock", true)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4623 {}
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4624
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4625 RefToScanQueueSet* queues() { return _queues; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4626
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4627 RefToScanQueue *work_queue(int i) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4628 return queues()->queue(i);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4629 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4630
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4631 ParallelTaskTerminator* terminator() { return &_terminator; }
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4632
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4633 virtual void set_for_termination(int active_workers) {
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4634 _root_processor->set_num_workers(active_workers);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4635 terminator()->reset_for_reuse(active_workers);
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4636 _n_workers = active_workers;
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4637 }
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
4638
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4639 // Helps out with CLD processing.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4640 //
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4641 // During InitialMark we need to:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4642 // 1) Scavenge all CLDs for the young GC.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4643 // 2) Mark all objects directly reachable from strong CLDs.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4644 template <G1Mark do_mark_object>
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4645 class G1CLDClosure : public CLDClosure {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4646 G1ParCopyClosure<G1BarrierNone, do_mark_object>* _oop_closure;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4647 G1ParCopyClosure<G1BarrierKlass, do_mark_object> _oop_in_klass_closure;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4648 G1KlassScanClosure _klass_in_cld_closure;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4649 bool _claim;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4650
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4651 public:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4652 G1CLDClosure(G1ParCopyClosure<G1BarrierNone, do_mark_object>* oop_closure,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4653 bool only_young, bool claim)
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4654 : _oop_closure(oop_closure),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4655 _oop_in_klass_closure(oop_closure->g1(),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4656 oop_closure->pss(),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4657 oop_closure->rp()),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4658 _klass_in_cld_closure(&_oop_in_klass_closure, only_young),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4659 _claim(claim) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4660
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4661 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4662
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4663 void do_cld(ClassLoaderData* cld) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4664 cld->oops_do(_oop_closure, &_klass_in_cld_closure, _claim);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4665 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4666 };
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4667
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
4668 void work(uint worker_id) {
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
4669 if (worker_id >= _n_workers) return; // no work needed this round
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1579
diff changeset
4670
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4671 _g1h->g1_policy()->phase_times()->record_time_secs(G1GCPhaseTimes::GCWorkerStart, worker_id, os::elapsedTime());
1611
215576b54709 6946048: G1: improvements to +PrintGCDetails output
tonyp
parents: 1579
diff changeset
4672
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4673 {
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4674 ResourceMark rm;
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4675 HandleMark hm;
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4676
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4677 ReferenceProcessor* rp = _g1h->ref_processor_stw();
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4678
17689
5d492d192cbf 8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents: 17688
diff changeset
4679 G1ParScanThreadState pss(_g1h, worker_id, rp);
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4680 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, rp);
17759
bc22cbb8b45a 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents: 17758
diff changeset
4681
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4682 pss.set_evac_failure_closure(&evac_failure_cl);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4683
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4684 bool only_young = _g1h->g1_policy()->gcs_are_young();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4685
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4686 // Non-IM young GC.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4687 G1ParCopyClosure<G1BarrierNone, G1MarkNone> scan_only_root_cl(_g1h, &pss, rp);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4688 G1CLDClosure<G1MarkNone> scan_only_cld_cl(&scan_only_root_cl,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4689 only_young, // Only process dirty klasses.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4690 false); // No need to claim CLDs.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4691 // IM young GC.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4692 // Strong roots closures.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4693 G1ParCopyClosure<G1BarrierNone, G1MarkFromRoot> scan_mark_root_cl(_g1h, &pss, rp);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4694 G1CLDClosure<G1MarkFromRoot> scan_mark_cld_cl(&scan_mark_root_cl,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4695 false, // Process all klasses.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4696 true); // Need to claim CLDs.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4697 // Weak roots closures.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4698 G1ParCopyClosure<G1BarrierNone, G1MarkPromotedFromRoot> scan_mark_weak_root_cl(_g1h, &pss, rp);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4699 G1CLDClosure<G1MarkPromotedFromRoot> scan_mark_weak_cld_cl(&scan_mark_weak_root_cl,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4700 false, // Process all klasses.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4701 true); // Need to claim CLDs.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4702
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4703 OopClosure* strong_root_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4704 OopClosure* weak_root_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4705 CLDClosure* strong_cld_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4706 CLDClosure* weak_cld_cl;
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4707
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4708 bool trace_metadata = false;
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4709
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4710 if (_g1h->g1_policy()->during_initial_mark_pause()) {
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4711 // We also need to mark copied objects.
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4712 strong_root_cl = &scan_mark_root_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4713 strong_cld_cl = &scan_mark_cld_cl;
20282
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4714 if (ClassUnloadingWithConcurrentMark) {
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4715 weak_root_cl = &scan_mark_weak_root_cl;
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4716 weak_cld_cl = &scan_mark_weak_cld_cl;
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4717 trace_metadata = true;
20282
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4718 } else {
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4719 weak_root_cl = &scan_mark_root_cl;
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4720 weak_cld_cl = &scan_mark_cld_cl;
f3aeae1f9fc5 8048269: Add flag to turn off class unloading after G1 concurrent mark
stefank
parents: 20279
diff changeset
4721 }
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4722 } else {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4723 strong_root_cl = &scan_only_root_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4724 weak_root_cl = &scan_only_root_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4725 strong_cld_cl = &scan_only_cld_cl;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4726 weak_cld_cl = &scan_only_cld_cl;
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4727 }
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4728
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4729 pss.start_strong_roots();
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4730
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4731 _root_processor->evacuate_roots(strong_root_cl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4732 weak_root_cl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4733 strong_cld_cl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4734 weak_cld_cl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4735 trace_metadata,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4736 worker_id);
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4737
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4738 G1ParPushHeapRSClosure push_heap_rs_cl(_g1h, &pss);
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4739 _root_processor->scan_remembered_sets(&push_heap_rs_cl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4740 weak_root_cl,
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
4741 worker_id);
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4742 pss.end_strong_roots();
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4743
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4744 {
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4745 double start = os::elapsedTime();
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4746 G1ParEvacuateFollowersClosure evac(_g1h, &pss, _queues, &_terminator);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4747 evac.do_void();
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4748 double elapsed_sec = os::elapsedTime() - start;
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4749 double term_sec = pss.term_time();
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4750 _g1h->g1_policy()->phase_times()->add_time_secs(G1GCPhaseTimes::ObjCopy, worker_id, elapsed_sec - term_sec);
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4751 _g1h->g1_policy()->phase_times()->record_time_secs(G1GCPhaseTimes::Termination, worker_id, term_sec);
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4752 _g1h->g1_policy()->phase_times()->record_thread_work_item(G1GCPhaseTimes::Termination, worker_id, pss.term_attempts());
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4753 }
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4754 _g1h->g1_policy()->record_thread_age_table(pss.age_table());
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4755 _g1h->update_surviving_young_words(pss.surviving_young_words()+1);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4756
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4757 if (ParallelGCVerbose) {
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4758 MutexLocker x(stats_lock());
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4759 pss.print_termination_stats(worker_id);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4760 }
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4761
20224
a2328cbebb23 8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents: 20223
diff changeset
4762 assert(pss.queue_is_empty(), "should be empty");
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4763
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4764 // Close the inner scope so that the ResourceMark and HandleMark
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4765 // destructors are executed here and are included as part of the
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
4766 // "GC Worker Time".
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4767 }
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
4768 _g1h->g1_policy()->phase_times()->record_time_secs(G1GCPhaseTimes::GCWorkerEnd, worker_id, os::elapsedTime());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4769 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4770 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
4771
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4772 class G1StringSymbolTableUnlinkTask : public AbstractGangTask {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4773 private:
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4774 BoolObjectClosure* _is_alive;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4775 int _initial_string_table_size;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4776 int _initial_symbol_table_size;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4777
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4778 bool _process_strings;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4779 int _strings_processed;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4780 int _strings_removed;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4781
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4782 bool _process_symbols;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4783 int _symbols_processed;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4784 int _symbols_removed;
17652
0eb64cfc0b76 8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents: 17651
diff changeset
4785
0eb64cfc0b76 8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents: 17651
diff changeset
4786 bool _do_in_parallel;
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4787 public:
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4788 G1StringSymbolTableUnlinkTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols) :
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4789 AbstractGangTask("String/Symbol Unlinking"),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4790 _is_alive(is_alive),
17652
0eb64cfc0b76 8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents: 17651
diff changeset
4791 _do_in_parallel(G1CollectedHeap::use_parallel_gc_threads()),
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4792 _process_strings(process_strings), _strings_processed(0), _strings_removed(0),
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4793 _process_symbols(process_symbols), _symbols_processed(0), _symbols_removed(0) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4794
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4795 _initial_string_table_size = StringTable::the_table()->table_size();
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4796 _initial_symbol_table_size = SymbolTable::the_table()->table_size();
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4797 if (process_strings) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4798 StringTable::clear_parallel_claimed_index();
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4799 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4800 if (process_symbols) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4801 SymbolTable::clear_parallel_claimed_index();
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4802 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4803 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4804
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4805 ~G1StringSymbolTableUnlinkTask() {
17652
0eb64cfc0b76 8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents: 17651
diff changeset
4806 guarantee(!_process_strings || !_do_in_parallel || StringTable::parallel_claimed_index() >= _initial_string_table_size,
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4807 err_msg("claim value "INT32_FORMAT" after unlink less than initial string table size "INT32_FORMAT,
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4808 StringTable::parallel_claimed_index(), _initial_string_table_size));
17652
0eb64cfc0b76 8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents: 17651
diff changeset
4809 guarantee(!_process_symbols || !_do_in_parallel || SymbolTable::parallel_claimed_index() >= _initial_symbol_table_size,
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4810 err_msg("claim value "INT32_FORMAT" after unlink less than initial symbol table size "INT32_FORMAT,
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4811 SymbolTable::parallel_claimed_index(), _initial_symbol_table_size));
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4812
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4813 if (G1TraceStringSymbolTableScrubbing) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4814 gclog_or_tty->print_cr("Cleaned string and symbol table, "
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4815 "strings: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed, "
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4816 "symbols: "SIZE_FORMAT" processed, "SIZE_FORMAT" removed",
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4817 strings_processed(), strings_removed(),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4818 symbols_processed(), symbols_removed());
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4819 }
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4820 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4821
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4822 void work(uint worker_id) {
17652
0eb64cfc0b76 8033443: Test8000311 fails after latest changes to parallelize string and symbol table unlink
tschatzl
parents: 17651
diff changeset
4823 if (_do_in_parallel) {
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4824 int strings_processed = 0;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4825 int strings_removed = 0;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4826 int symbols_processed = 0;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4827 int symbols_removed = 0;
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4828 if (_process_strings) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4829 StringTable::possibly_parallel_unlink(_is_alive, &strings_processed, &strings_removed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4830 Atomic::add(strings_processed, &_strings_processed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4831 Atomic::add(strings_removed, &_strings_removed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4832 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4833 if (_process_symbols) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4834 SymbolTable::possibly_parallel_unlink(&symbols_processed, &symbols_removed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4835 Atomic::add(symbols_processed, &_symbols_processed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4836 Atomic::add(symbols_removed, &_symbols_removed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4837 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4838 } else {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4839 if (_process_strings) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4840 StringTable::unlink(_is_alive, &_strings_processed, &_strings_removed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4841 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4842 if (_process_symbols) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4843 SymbolTable::unlink(&_symbols_processed, &_symbols_removed);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4844 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4845 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4846 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4847
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4848 size_t strings_processed() const { return (size_t)_strings_processed; }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4849 size_t strings_removed() const { return (size_t)_strings_removed; }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4850
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4851 size_t symbols_processed() const { return (size_t)_symbols_processed; }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4852 size_t symbols_removed() const { return (size_t)_symbols_removed; }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4853 };
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
4854
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4855 class G1CodeCacheUnloadingTask VALUE_OBJ_CLASS_SPEC {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4856 private:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4857 static Monitor* _lock;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4858
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4859 BoolObjectClosure* const _is_alive;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4860 const bool _unloading_occurred;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4861 const uint _num_workers;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4862
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4863 // Variables used to claim nmethods.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4864 nmethod* _first_nmethod;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4865 volatile nmethod* _claimed_nmethod;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4866
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4867 // The list of nmethods that need to be processed by the second pass.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4868 volatile nmethod* _postponed_list;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4869 volatile uint _num_entered_barrier;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4870
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4871 public:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4872 G1CodeCacheUnloadingTask(uint num_workers, BoolObjectClosure* is_alive, bool unloading_occurred) :
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4873 _is_alive(is_alive),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4874 _unloading_occurred(unloading_occurred),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4875 _num_workers(num_workers),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4876 _first_nmethod(NULL),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4877 _claimed_nmethod(NULL),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4878 _postponed_list(NULL),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4879 _num_entered_barrier(0)
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4880 {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4881 nmethod::increase_unloading_clock();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4882 _first_nmethod = CodeCache::alive_nmethod(CodeCache::first());
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4883 _claimed_nmethod = (volatile nmethod*)_first_nmethod;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4884 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4885
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4886 ~G1CodeCacheUnloadingTask() {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4887 CodeCache::verify_clean_inline_caches();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4888
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4889 CodeCache::set_needs_cache_clean(false);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4890 guarantee(CodeCache::scavenge_root_nmethods() == NULL, "Must be");
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4891
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4892 CodeCache::verify_icholder_relocations();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4893 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4894
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4895 private:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4896 void add_to_postponed_list(nmethod* nm) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4897 nmethod* old;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4898 do {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4899 old = (nmethod*)_postponed_list;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4900 nm->set_unloading_next(old);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4901 } while ((nmethod*)Atomic::cmpxchg_ptr(nm, &_postponed_list, old) != old);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4902 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4903
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4904 void clean_nmethod(nmethod* nm) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4905 bool postponed = nm->do_unloading_parallel(_is_alive, _unloading_occurred);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4906
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4907 if (postponed) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4908 // This nmethod referred to an nmethod that has not been cleaned/unloaded yet.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4909 add_to_postponed_list(nm);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4910 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4911
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4912 // Mark that this thread has been cleaned/unloaded.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4913 // After this call, it will be safe to ask if this nmethod was unloaded or not.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4914 nm->set_unloading_clock(nmethod::global_unloading_clock());
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4915 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4916
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4917 void clean_nmethod_postponed(nmethod* nm) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4918 nm->do_unloading_parallel_postponed(_is_alive, _unloading_occurred);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4919 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4920
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4921 static const int MaxClaimNmethods = 16;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4922
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4923 void claim_nmethods(nmethod** claimed_nmethods, int *num_claimed_nmethods) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4924 nmethod* first;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4925 nmethod* last;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4926
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4927 do {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4928 *num_claimed_nmethods = 0;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4929
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4930 first = last = (nmethod*)_claimed_nmethod;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4931
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4932 if (first != NULL) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4933 for (int i = 0; i < MaxClaimNmethods; i++) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4934 last = CodeCache::alive_nmethod(CodeCache::next(last));
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4935
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4936 if (last == NULL) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4937 break;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4938 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4939
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4940 claimed_nmethods[i] = last;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4941 (*num_claimed_nmethods)++;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4942 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4943 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4944
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4945 } while ((nmethod*)Atomic::cmpxchg_ptr(last, &_claimed_nmethod, first) != first);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4946 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4947
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4948 nmethod* claim_postponed_nmethod() {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4949 nmethod* claim;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4950 nmethod* next;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4951
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4952 do {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4953 claim = (nmethod*)_postponed_list;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4954 if (claim == NULL) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4955 return NULL;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4956 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4957
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4958 next = claim->unloading_next();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4959
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4960 } while ((nmethod*)Atomic::cmpxchg_ptr(next, &_postponed_list, claim) != claim);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4961
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4962 return claim;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4963 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4964
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4965 public:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4966 // Mark that we're done with the first pass of nmethod cleaning.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4967 void barrier_mark(uint worker_id) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4968 MonitorLockerEx ml(_lock, Mutex::_no_safepoint_check_flag);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4969 _num_entered_barrier++;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4970 if (_num_entered_barrier == _num_workers) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4971 ml.notify_all();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4972 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4973 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4974
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4975 // See if we have to wait for the other workers to
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4976 // finish their first-pass nmethod cleaning work.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4977 void barrier_wait(uint worker_id) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4978 if (_num_entered_barrier < _num_workers) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4979 MonitorLockerEx ml(_lock, Mutex::_no_safepoint_check_flag);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4980 while (_num_entered_barrier < _num_workers) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4981 ml.wait(Mutex::_no_safepoint_check_flag, 0, false);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4982 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4983 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4984 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4985
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4986 // Cleaning and unloading of nmethods. Some work has to be postponed
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4987 // to the second pass, when we know which nmethods survive.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4988 void work_first_pass(uint worker_id) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4989 // The first nmethods is claimed by the first worker.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4990 if (worker_id == 0 && _first_nmethod != NULL) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4991 clean_nmethod(_first_nmethod);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4992 _first_nmethod = NULL;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4993 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4994
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4995 int num_claimed_nmethods;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4996 nmethod* claimed_nmethods[MaxClaimNmethods];
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4997
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4998 while (true) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
4999 claim_nmethods(claimed_nmethods, &num_claimed_nmethods);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5000
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5001 if (num_claimed_nmethods == 0) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5002 break;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5003 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5004
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5005 for (int i = 0; i < num_claimed_nmethods; i++) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5006 clean_nmethod(claimed_nmethods[i]);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5007 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5008 }
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5009
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5010 // The nmethod cleaning helps out and does the CodeCache part of MetadataOnStackMark.
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5011 // Need to retire the buffers now that this thread has stopped cleaning nmethods.
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5012 MetadataOnStackMark::retire_buffer_for_thread(Thread::current());
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5013 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5014
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5015 void work_second_pass(uint worker_id) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5016 nmethod* nm;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5017 // Take care of postponed nmethods.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5018 while ((nm = claim_postponed_nmethod()) != NULL) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5019 clean_nmethod_postponed(nm);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5020 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5021 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5022 };
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5023
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5024 Monitor* G1CodeCacheUnloadingTask::_lock = new Monitor(Mutex::leaf, "Code Cache Unload lock");
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5025
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5026 class G1KlassCleaningTask : public StackObj {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5027 BoolObjectClosure* _is_alive;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5028 volatile jint _clean_klass_tree_claimed;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5029 ClassLoaderDataGraphKlassIteratorAtomic _klass_iterator;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5030
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5031 public:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5032 G1KlassCleaningTask(BoolObjectClosure* is_alive) :
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5033 _is_alive(is_alive),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5034 _clean_klass_tree_claimed(0),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5035 _klass_iterator() {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5036 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5037
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5038 private:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5039 bool claim_clean_klass_tree_task() {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5040 if (_clean_klass_tree_claimed) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5041 return false;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5042 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5043
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5044 return Atomic::cmpxchg(1, (jint*)&_clean_klass_tree_claimed, 0) == 0;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5045 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5046
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5047 InstanceKlass* claim_next_klass() {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5048 Klass* klass;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5049 do {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5050 klass =_klass_iterator.next_klass();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5051 } while (klass != NULL && !klass->oop_is_instance());
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5052
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5053 return (InstanceKlass*)klass;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5054 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5055
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5056 public:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5057
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5058 void clean_klass(InstanceKlass* ik) {
23463
5cece4584b8e 8058563: InstanceKlass::_dependencies list isn't cleared from empty nmethodBucket entries
stefank
parents: 23228
diff changeset
5059 ik->clean_weak_instanceklass_links(_is_alive);
5cece4584b8e 8058563: InstanceKlass::_dependencies list isn't cleared from empty nmethodBucket entries
stefank
parents: 23228
diff changeset
5060
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5061 if (JvmtiExport::has_redefined_a_class()) {
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5062 InstanceKlass::purge_previous_versions(ik);
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5063 }
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5064 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5065
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5066 void work() {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5067 ResourceMark rm;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5068
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5069 // One worker will clean the subklass/sibling klass tree.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5070 if (claim_clean_klass_tree_task()) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5071 Klass::clean_subklass_tree(_is_alive);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5072 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5073
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5074 // All workers will help cleaning the classes,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5075 InstanceKlass* klass;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5076 while ((klass = claim_next_klass()) != NULL) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5077 clean_klass(klass);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5078 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5079 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5080 };
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5081
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5082 // To minimize the remark pause times, the tasks below are done in parallel.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5083 class G1ParallelCleaningTask : public AbstractGangTask {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5084 private:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5085 G1StringSymbolTableUnlinkTask _string_symbol_task;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5086 G1CodeCacheUnloadingTask _code_cache_task;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5087 G1KlassCleaningTask _klass_cleaning_task;
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5088
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5089 public:
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5090 // The constructor is run in the VMThread.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5091 G1ParallelCleaningTask(BoolObjectClosure* is_alive, bool process_strings, bool process_symbols, uint num_workers, bool unloading_occurred) :
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5092 AbstractGangTask("Parallel Cleaning"),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5093 _string_symbol_task(is_alive, process_strings, process_symbols),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5094 _code_cache_task(num_workers, is_alive, unloading_occurred),
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5095 _klass_cleaning_task(is_alive) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5096 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5097
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5098 void pre_work_verification() {
20632
706dce84c9df 8064556: G1: ParallelGCThreads=0 may cause assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current())) failed: Should be empty
stefank
parents: 20619
diff changeset
5099 // The VM Thread will have registered Metadata during the single-threaded phase of MetadataStackOnMark.
706dce84c9df 8064556: G1: ParallelGCThreads=0 may cause assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current())) failed: Should be empty
stefank
parents: 20619
diff changeset
5100 assert(Thread::current()->is_VM_thread()
706dce84c9df 8064556: G1: ParallelGCThreads=0 may cause assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current())) failed: Should be empty
stefank
parents: 20619
diff changeset
5101 || !MetadataOnStackMark::has_buffer_for_thread(Thread::current()), "Should be empty");
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5102 }
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5103
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5104 void post_work_verification() {
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5105 assert(!MetadataOnStackMark::has_buffer_for_thread(Thread::current()), "Should be empty");
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5106 }
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5107
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5108 // The parallel work done by all worker threads.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5109 void work(uint worker_id) {
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5110 pre_work_verification();
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5111
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5112 // Do first pass of code cache cleaning.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5113 _code_cache_task.work_first_pass(worker_id);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5114
20279
870c03421152 8049426: Minor cleanups after G1 class unloading
ehelin
parents: 20278
diff changeset
5115 // Let the threads mark that the first pass is done.
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5116 _code_cache_task.barrier_mark(worker_id);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5117
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5118 // Clean the Strings and Symbols.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5119 _string_symbol_task.work(worker_id);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5120
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5121 // Wait for all workers to finish the first code cache cleaning pass.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5122 _code_cache_task.barrier_wait(worker_id);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5123
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5124 // Do the second code cache cleaning work, which realize on
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5125 // the liveness information gathered during the first pass.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5126 _code_cache_task.work_second_pass(worker_id);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5127
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5128 // Clean all klasses that were not unloaded.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5129 _klass_cleaning_task.work();
20619
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5130
b12a2a9b05ca 8056240: Investigate increased GC remark time after class unloading changes in CRM Fuse
stefank
parents: 20571
diff changeset
5131 post_work_verification();
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5132 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5133 };
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5134
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5135
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5136 void G1CollectedHeap::parallel_cleaning(BoolObjectClosure* is_alive,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5137 bool process_strings,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5138 bool process_symbols,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5139 bool class_unloading_occurred) {
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5140 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5141 workers()->active_workers() : 1);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5142
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5143 G1ParallelCleaningTask g1_unlink_task(is_alive, process_strings, process_symbols,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5144 n_workers, class_unloading_occurred);
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5145 if (G1CollectedHeap::use_parallel_gc_threads()) {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5146 set_par_threads(n_workers);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5147 workers()->run_task(&g1_unlink_task);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5148 set_par_threads(0);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5149 } else {
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5150 g1_unlink_task.work(0);
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5151 }
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5152 }
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5153
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5154 void G1CollectedHeap::unlink_string_and_symbol_table(BoolObjectClosure* is_alive,
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5155 bool process_strings, bool process_symbols) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5156 {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5157 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5158 _g1h->workers()->active_workers() : 1);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5159 G1StringSymbolTableUnlinkTask g1_unlink_task(is_alive, process_strings, process_symbols);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5160 if (G1CollectedHeap::use_parallel_gc_threads()) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5161 set_par_threads(n_workers);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5162 workers()->run_task(&g1_unlink_task);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5163 set_par_threads(0);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5164 } else {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5165 g1_unlink_task.work(0);
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5166 }
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5167 }
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
5168
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
5169 if (G1StringDedup::is_enabled()) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
5170 G1StringDedup::unlink(is_alive);
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
5171 }
17634
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5172 }
5a32d2a3cc1e 8027476: Improve performance of Stringtable unlink
tschatzl
parents: 13400
diff changeset
5173
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5174 class G1RedirtyLoggedCardsTask : public AbstractGangTask {
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5175 private:
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5176 DirtyCardQueueSet* _queue;
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5177 public:
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5178 G1RedirtyLoggedCardsTask(DirtyCardQueueSet* queue) : AbstractGangTask("Redirty Cards"), _queue(queue) { }
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5179
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5180 virtual void work(uint worker_id) {
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5181 G1GCPhaseTimes* phase_times = G1CollectedHeap::heap()->g1_policy()->phase_times();
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5182 G1GCParPhaseTimesTracker x(phase_times, G1GCPhaseTimes::RedirtyCards, worker_id);
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5183
20217
6b52700a896b 8040002: Clean up code and code duplication in re-diryting cards for verification
tschatzl
parents: 20216
diff changeset
5184 RedirtyLoggedCardTableEntryClosure cl;
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5185 if (G1CollectedHeap::heap()->use_parallel_gc_threads()) {
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5186 _queue->par_apply_closure_to_all_completed_buffers(&cl);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5187 } else {
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5188 _queue->apply_closure_to_all_completed_buffers(&cl);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5189 }
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5190
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5191 phase_times->record_thread_work_item(G1GCPhaseTimes::RedirtyCards, worker_id, cl.num_processed());
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5192 }
17756
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5193 };
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5194
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5195 void G1CollectedHeap::redirty_logged_cards() {
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5196 double redirty_logged_cards_start = os::elapsedTime();
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5197
20216
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5198 uint n_workers = (G1CollectedHeap::use_parallel_gc_threads() ?
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5199 _g1h->workers()->active_workers() : 1);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5200
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5201 G1RedirtyLoggedCardsTask redirty_task(&dirty_card_queue_set());
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5202 dirty_card_queue_set().reset_for_par_iteration();
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5203 if (use_parallel_gc_threads()) {
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5204 set_par_threads(n_workers);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5205 workers()->run_task(&redirty_task);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5206 set_par_threads(0);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5207 } else {
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5208 redirty_task.work(0);
570cb6369f17 8019342: G1: High "Other" time most likely due to card redirtying
tschatzl
parents: 20215
diff changeset
5209 }
17756
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5210
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5211 DirtyCardQueueSet& dcq = JavaThread::dirty_card_queue_set();
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5212 dcq.merge_bufferlists(&dirty_card_queue_set());
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5213 assert(dirty_card_queue_set().completed_buffers_num() == 0, "All should be consumed");
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5214
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5215 g1_policy()->phase_times()->record_redirty_logged_cards_time_ms((os::elapsedTime() - redirty_logged_cards_start) * 1000.0);
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5216 }
a07bea31ef35 8035398: Add card redirty time in "Other" time in G1
tschatzl
parents: 17755
diff changeset
5217
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5218 // Weak Reference Processing support
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5219
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5220 // An always "is_alive" closure that is used to preserve referents.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5221 // If the object is non-null then it's alive. Used in the preservation
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5222 // of referent objects that are pointed to by reference objects
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5223 // discovered by the CM ref processor.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5224 class G1AlwaysAliveClosure: public BoolObjectClosure {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5225 G1CollectedHeap* _g1;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5226 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5227 G1AlwaysAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5228 bool do_object_b(oop p) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5229 if (p != NULL) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5230 return true;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5231 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5232 return false;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5233 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5234 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5235
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5236 bool G1STWIsAliveClosure::do_object_b(oop p) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5237 // An object is reachable if it is outside the collection set,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5238 // or is inside and copied.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5239 return !_g1->obj_in_cs(p) || p->is_forwarded();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5240 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5241
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5242 // Non Copying Keep Alive closure
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5243 class G1KeepAliveClosure: public OopClosure {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5244 G1CollectedHeap* _g1;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5245 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5246 G1KeepAliveClosure(G1CollectedHeap* g1) : _g1(g1) {}
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5247 void do_oop(narrowOop* p) { guarantee(false, "Not needed"); }
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5248 void do_oop(oop* p) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5249 oop obj = *p;
20503
fa56205f142c 8057799: Unnecessary NULL check in G1KeepAliveClosure
tonyp
parents: 20494
diff changeset
5250 assert(obj != NULL, "the caller should have filtered out NULL values");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5251
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
5252 const InCSetState cset_state = _g1->in_cset_state(obj);
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
5253 if (!cset_state.is_in_cset_or_humongous()) {
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5254 return;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5255 }
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
5256 if (cset_state.is_in_cset()) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5257 assert( obj->is_forwarded(), "invariant" );
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5258 *p = obj->forwardee();
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5259 } else {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5260 assert(!obj->is_forwarded(), "invariant" );
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
5261 assert(cset_state.is_humongous(),
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
5262 err_msg("Only allowed InCSet state is IsHumongous, but is %d", cset_state.value()));
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5263 _g1->set_humongous_is_live(obj);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5264 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5265 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5266 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5267
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5268 // Copying Keep Alive closure - can be called from both
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5269 // serial and parallel code as long as different worker
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5270 // threads utilize different G1ParScanThreadState instances
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5271 // and different queues.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5272
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5273 class G1CopyingKeepAliveClosure: public OopClosure {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5274 G1CollectedHeap* _g1h;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5275 OopClosure* _copy_non_heap_obj_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5276 G1ParScanThreadState* _par_scan_state;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5277
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5278 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5279 G1CopyingKeepAliveClosure(G1CollectedHeap* g1h,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5280 OopClosure* non_heap_obj_cl,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5281 G1ParScanThreadState* pss):
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5282 _g1h(g1h),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5283 _copy_non_heap_obj_cl(non_heap_obj_cl),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5284 _par_scan_state(pss)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5285 {}
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5286
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5287 virtual void do_oop(narrowOop* p) { do_oop_work(p); }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5288 virtual void do_oop( oop* p) { do_oop_work(p); }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5289
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5290 template <class T> void do_oop_work(T* p) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5291 oop obj = oopDesc::load_decode_heap_oop(p);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5292
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5293 if (_g1h->is_in_cset_or_humongous(obj)) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5294 // If the referent object has been forwarded (either copied
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5295 // to a new location or to itself in the event of an
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5296 // evacuation failure) then we need to update the reference
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5297 // field and, if both reference and referent are in the G1
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5298 // heap, update the RSet for the referent.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5299 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5300 // If the referent has not been forwarded then we have to keep
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5301 // it alive by policy. Therefore we have copy the referent.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5302 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5303 // If the reference field is in the G1 heap then we can push
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5304 // on the PSS queue. When the queue is drained (after each
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5305 // phase of reference processing) the object and it's followers
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5306 // will be copied, the reference field set to point to the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5307 // new location, and the RSet updated. Otherwise we need to
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
5308 // use the the non-heap or metadata closures directly to copy
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5309 // the referent object and update the pointer, while avoiding
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5310 // updating the RSet.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5311
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5312 if (_g1h->is_in_g1_reserved(p)) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5313 _par_scan_state->push_on_queue(p);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5314 } else {
17935
7384f6a12fc1 8038212: Method::is_valid_method() check has performance regression impact for stackwalking
coleenp
parents: 17866
diff changeset
5315 assert(!Metaspace::contains((const void*)p),
20270
b7d24d2bc8be 8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents: 20257
diff changeset
5316 err_msg("Unexpectedly found a pointer from metadata: "
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6629
diff changeset
5317 PTR_FORMAT, p));
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5318 _copy_non_heap_obj_cl->do_oop(p);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5319 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5320 }
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
5321 }
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5322 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5323
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5324 // Serial drain queue closure. Called as the 'complete_gc'
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5325 // closure for each discovered list in some of the
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5326 // reference processing phases.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5327
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5328 class G1STWDrainQueueClosure: public VoidClosure {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5329 protected:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5330 G1CollectedHeap* _g1h;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5331 G1ParScanThreadState* _par_scan_state;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5332
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5333 G1ParScanThreadState* par_scan_state() { return _par_scan_state; }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5334
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5335 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5336 G1STWDrainQueueClosure(G1CollectedHeap* g1h, G1ParScanThreadState* pss) :
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5337 _g1h(g1h),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5338 _par_scan_state(pss)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5339 { }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5340
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5341 void do_void() {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5342 G1ParScanThreadState* const pss = par_scan_state();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5343 pss->trim_queue();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5344 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5345 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5346
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5347 // Parallel Reference Processing closures
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5348
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5349 // Implementation of AbstractRefProcTaskExecutor for parallel reference
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5350 // processing during G1 evacuation pauses.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5351
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5352 class G1STWRefProcTaskExecutor: public AbstractRefProcTaskExecutor {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5353 private:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5354 G1CollectedHeap* _g1h;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5355 RefToScanQueueSet* _queues;
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5356 FlexibleWorkGang* _workers;
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5357 int _active_workers;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5358
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5359 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5360 G1STWRefProcTaskExecutor(G1CollectedHeap* g1h,
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5361 FlexibleWorkGang* workers,
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5362 RefToScanQueueSet *task_queues,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5363 int n_workers) :
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5364 _g1h(g1h),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5365 _queues(task_queues),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5366 _workers(workers),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5367 _active_workers(n_workers)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5368 {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5369 assert(n_workers > 0, "shouldn't call this otherwise");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5370 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5371
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5372 // Executes the given task using concurrent marking worker threads.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5373 virtual void execute(ProcessTask& task);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5374 virtual void execute(EnqueueTask& task);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5375 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5376
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5377 // Gang task for possibly parallel reference processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5378
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5379 class G1STWRefProcTaskProxy: public AbstractGangTask {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5380 typedef AbstractRefProcTaskExecutor::ProcessTask ProcessTask;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5381 ProcessTask& _proc_task;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5382 G1CollectedHeap* _g1h;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5383 RefToScanQueueSet *_task_queues;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5384 ParallelTaskTerminator* _terminator;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5385
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5386 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5387 G1STWRefProcTaskProxy(ProcessTask& proc_task,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5388 G1CollectedHeap* g1h,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5389 RefToScanQueueSet *task_queues,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5390 ParallelTaskTerminator* terminator) :
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5391 AbstractGangTask("Process reference objects in parallel"),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5392 _proc_task(proc_task),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5393 _g1h(g1h),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5394 _task_queues(task_queues),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5395 _terminator(terminator)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5396 {}
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5397
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5398 virtual void work(uint worker_id) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5399 // The reference processing task executed by a single worker.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5400 ResourceMark rm;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5401 HandleMark hm;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5402
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5403 G1STWIsAliveClosure is_alive(_g1h);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5404
17689
5d492d192cbf 8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents: 17688
diff changeset
5405 G1ParScanThreadState pss(_g1h, worker_id, NULL);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5406 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
17759
bc22cbb8b45a 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents: 17758
diff changeset
5407
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5408 pss.set_evac_failure_closure(&evac_failure_cl);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5409
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5410 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5411
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5412 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5413
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5414 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5415
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5416 if (_g1h->g1_policy()->during_initial_mark_pause()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5417 // We also need to mark copied objects.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5418 copy_non_heap_cl = &copy_mark_non_heap_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5419 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5420
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5421 // Keep alive closure.
20270
b7d24d2bc8be 8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents: 20257
diff changeset
5422 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5423
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5424 // Complete GC closure
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5425 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _task_queues, _terminator);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5426
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5427 // Call the reference processing task's work routine.
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5428 _proc_task.work(worker_id, is_alive, keep_alive, drain_queue);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5429
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5430 // Note we cannot assert that the refs array is empty here as not all
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5431 // of the processing tasks (specifically phase2 - pp2_work) execute
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5432 // the complete_gc closure (which ordinarily would drain the queue) so
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5433 // the queue may not be empty.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5434 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5435 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5436
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5437 // Driver routine for parallel reference processing.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5438 // Creates an instance of the ref processing gang
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5439 // task and has the worker threads execute it.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5440 void G1STWRefProcTaskExecutor::execute(ProcessTask& proc_task) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5441 assert(_workers != NULL, "Need parallel worker threads.");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5442
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5443 ParallelTaskTerminator terminator(_active_workers, _queues);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5444 G1STWRefProcTaskProxy proc_task_proxy(proc_task, _g1h, _queues, &terminator);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5445
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5446 _g1h->set_par_threads(_active_workers);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5447 _workers->run_task(&proc_task_proxy);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5448 _g1h->set_par_threads(0);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5449 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5450
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5451 // Gang task for parallel reference enqueueing.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5452
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5453 class G1STWRefEnqueueTaskProxy: public AbstractGangTask {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5454 typedef AbstractRefProcTaskExecutor::EnqueueTask EnqueueTask;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5455 EnqueueTask& _enq_task;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5456
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5457 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5458 G1STWRefEnqueueTaskProxy(EnqueueTask& enq_task) :
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5459 AbstractGangTask("Enqueue reference objects in parallel"),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5460 _enq_task(enq_task)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5461 { }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5462
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5463 virtual void work(uint worker_id) {
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5464 _enq_task.work(worker_id);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5465 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5466 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5467
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5468 // Driver routine for parallel reference enqueueing.
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5469 // Creates an instance of the ref enqueueing gang
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5470 // task and has the worker threads execute it.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5471
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5472 void G1STWRefProcTaskExecutor::execute(EnqueueTask& enq_task) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5473 assert(_workers != NULL, "Need parallel worker threads.");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5474
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5475 G1STWRefEnqueueTaskProxy enq_task_proxy(enq_task);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5476
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5477 _g1h->set_par_threads(_active_workers);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5478 _workers->run_task(&enq_task_proxy);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5479 _g1h->set_par_threads(0);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5480 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5481
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5482 // End of weak reference support closures
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5483
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5484 // Abstract task used to preserve (i.e. copy) any referent objects
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5485 // that are in the collection set and are pointed to by reference
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5486 // objects discovered by the CM ref processor.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5487
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5488 class G1ParPreserveCMReferentsTask: public AbstractGangTask {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5489 protected:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5490 G1CollectedHeap* _g1h;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5491 RefToScanQueueSet *_queues;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5492 ParallelTaskTerminator _terminator;
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5493 uint _n_workers;
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5494
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5495 public:
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5496 G1ParPreserveCMReferentsTask(G1CollectedHeap* g1h,int workers, RefToScanQueueSet *task_queues) :
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5497 AbstractGangTask("ParPreserveCMReferents"),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5498 _g1h(g1h),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5499 _queues(task_queues),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5500 _terminator(workers, _queues),
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5501 _n_workers(workers)
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5502 { }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5503
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5504 void work(uint worker_id) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5505 ResourceMark rm;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5506 HandleMark hm;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5507
17689
5d492d192cbf 8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents: 17688
diff changeset
5508 G1ParScanThreadState pss(_g1h, worker_id, NULL);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5509 G1ParScanHeapEvacFailureClosure evac_failure_cl(_g1h, &pss, NULL);
17759
bc22cbb8b45a 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents: 17758
diff changeset
5510
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5511 pss.set_evac_failure_closure(&evac_failure_cl);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5512
20224
a2328cbebb23 8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents: 20223
diff changeset
5513 assert(pss.queue_is_empty(), "both queue and overflow should be empty");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5514
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5515 G1ParScanExtRootClosure only_copy_non_heap_cl(_g1h, &pss, NULL);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5516
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5517 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(_g1h, &pss, NULL);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5518
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5519 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5520
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5521 if (_g1h->g1_policy()->during_initial_mark_pause()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5522 // We also need to mark copied objects.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5523 copy_non_heap_cl = &copy_mark_non_heap_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5524 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5525
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5526 // Is alive closure
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5527 G1AlwaysAliveClosure always_alive(_g1h);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5528
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5529 // Copying keep alive closure. Applied to referent objects that need
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5530 // to be copied.
20270
b7d24d2bc8be 8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents: 20257
diff changeset
5531 G1CopyingKeepAliveClosure keep_alive(_g1h, copy_non_heap_cl, &pss);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5532
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5533 ReferenceProcessor* rp = _g1h->ref_processor_cm();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5534
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5535 uint limit = ReferenceProcessor::number_of_subclasses_of_ref() * rp->max_num_q();
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5536 uint stride = MIN2(MAX2(_n_workers, 1U), limit);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5537
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5538 // limit is set using max_num_q() - which was set using ParallelGCThreads.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5539 // So this must be true - but assert just in case someone decides to
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5540 // change the worker ids.
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5541 assert(0 <= worker_id && worker_id < limit, "sanity");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5542 assert(!rp->discovery_is_atomic(), "check this code");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5543
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5544 // Select discovered lists [i, i+stride, i+2*stride,...,limit)
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5545 for (uint idx = worker_id; idx < limit; idx += stride) {
4014
bf2d2b8b1726 7095243: Disambiguate ReferenceProcessor::_discoveredSoftRefs
johnc
parents: 4013
diff changeset
5546 DiscoveredList& ref_list = rp->discovered_refs()[idx];
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5547
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5548 DiscoveredListIterator iter(ref_list, &keep_alive, &always_alive);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5549 while (iter.has_next()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5550 // Since discovery is not atomic for the CM ref processor, we
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5551 // can see some null referent objects.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5552 iter.load_ptrs(DEBUG_ONLY(true));
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5553 oop ref = iter.obj();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5554
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5555 // This will filter nulls.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5556 if (iter.is_referent_alive()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5557 iter.make_referent_alive();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5558 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5559 iter.move_to_next();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5560 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5561 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5562
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5563 // Drain the queue - which may cause stealing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5564 G1ParEvacuateFollowersClosure drain_queue(_g1h, &pss, _queues, &_terminator);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5565 drain_queue.do_void();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5566 // Allocation buffers were retired at the end of G1ParEvacuateFollowersClosure
20224
a2328cbebb23 8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents: 20223
diff changeset
5567 assert(pss.queue_is_empty(), "should be");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5568 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5569 };
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5570
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5571 // Weak Reference processing during an evacuation pause (part 1).
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5572 void G1CollectedHeap::process_discovered_references(uint no_of_gc_workers) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5573 double ref_proc_start = os::elapsedTime();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5574
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5575 ReferenceProcessor* rp = _ref_processor_stw;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5576 assert(rp->discovery_enabled(), "should have been enabled");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5577
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5578 // Any reference objects, in the collection set, that were 'discovered'
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5579 // by the CM ref processor should have already been copied (either by
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5580 // applying the external root copy closure to the discovered lists, or
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5581 // by following an RSet entry).
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5582 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5583 // But some of the referents, that are in the collection set, that these
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5584 // reference objects point to may not have been copied: the STW ref
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5585 // processor would have seen that the reference object had already
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5586 // been 'discovered' and would have skipped discovering the reference,
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5587 // but would not have treated the reference object as a regular oop.
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5588 // As a result the copy closure would not have been applied to the
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5589 // referent object.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5590 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5591 // We need to explicitly copy these referent objects - the references
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5592 // will be processed at the end of remarking.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5593 //
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5594 // We also need to do this copying before we process the reference
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5595 // objects discovered by the STW ref processor in case one of these
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5596 // referents points to another object which is also referenced by an
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5597 // object discovered by the STW ref processor.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5598
4711
adedfbbf0360 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 4710
diff changeset
5599 assert(!G1CollectedHeap::use_parallel_gc_threads() ||
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5600 no_of_gc_workers == workers()->active_workers(),
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5601 "Need to reset active GC workers");
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5602
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5603 set_par_threads(no_of_gc_workers);
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5604 G1ParPreserveCMReferentsTask keep_cm_referents(this,
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5605 no_of_gc_workers,
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5606 _task_queues);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5607
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5608 if (G1CollectedHeap::use_parallel_gc_threads()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5609 workers()->run_task(&keep_cm_referents);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5610 } else {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5611 keep_cm_referents.work(0);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5612 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5613
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5614 set_par_threads(0);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5615
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5616 // Closure to test whether a referent is alive.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5617 G1STWIsAliveClosure is_alive(this);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5618
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5619 // Even when parallel reference processing is enabled, the processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5620 // of JNI refs is serial and performed serially by the current thread
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5621 // rather than by a worker. The following PSS will be used for processing
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5622 // JNI refs.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5623
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5624 // Use only a single queue for this PSS.
17689
5d492d192cbf 8035329: Move G1ParCopyClosure::copy_to_survivor_space into G1ParScanThreadState
tschatzl
parents: 17688
diff changeset
5625 G1ParScanThreadState pss(this, 0, NULL);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5626
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5627 // We do not embed a reference processor in the copying/scanning
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5628 // closures while we're actually processing the discovered
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5629 // reference objects.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5630 G1ParScanHeapEvacFailureClosure evac_failure_cl(this, &pss, NULL);
17759
bc22cbb8b45a 8035330: Remove G1ParScanPartialArrayClosure and G1ParScanHeapEvacClosure
tschatzl
parents: 17758
diff changeset
5631
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5632 pss.set_evac_failure_closure(&evac_failure_cl);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5633
20224
a2328cbebb23 8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents: 20223
diff changeset
5634 assert(pss.queue_is_empty(), "pre-condition");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5635
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5636 G1ParScanExtRootClosure only_copy_non_heap_cl(this, &pss, NULL);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5637
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5638 G1ParScanAndMarkExtRootClosure copy_mark_non_heap_cl(this, &pss, NULL);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5639
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5640 OopClosure* copy_non_heap_cl = &only_copy_non_heap_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5641
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5642 if (_g1h->g1_policy()->during_initial_mark_pause()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5643 // We also need to mark copied objects.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5644 copy_non_heap_cl = &copy_mark_non_heap_cl;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5645 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5646
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5647 // Keep alive closure.
20270
b7d24d2bc8be 8047323: Remove unused _copy_metadata_obj_cl in G1CopyingKeepAliveClosure
stefank
parents: 20257
diff changeset
5648 G1CopyingKeepAliveClosure keep_alive(this, copy_non_heap_cl, &pss);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5649
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5650 // Serial Complete GC closure
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5651 G1STWDrainQueueClosure drain_queue(this, &pss);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5652
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5653 // Setup the soft refs policy...
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5654 rp->setup_policy(false);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5655
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5656 ReferenceProcessorStats stats;
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5657 if (!rp->processing_is_mt()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5658 // Serial reference processing...
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5659 stats = rp->process_discovered_references(&is_alive,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5660 &keep_alive,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5661 &drain_queue,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5662 NULL,
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17992
diff changeset
5663 _gc_timer_stw,
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17992
diff changeset
5664 _gc_tracer_stw->gc_id());
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5665 } else {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5666 // Parallel reference processing
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5667 assert(rp->num_q() == no_of_gc_workers, "sanity");
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5668 assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5669
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5670 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5671 stats = rp->process_discovered_references(&is_alive,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5672 &keep_alive,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5673 &drain_queue,
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5674 &par_task_executor,
20190
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17992
diff changeset
5675 _gc_timer_stw,
0982ec23da03 8043607: Add a GC id as a log decoration similar to PrintGCTimeStamps
brutisso
parents: 17992
diff changeset
5676 _gc_tracer_stw->gc_id());
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5677 }
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5678
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5679 _gc_tracer_stw->report_gc_reference_stats(stats);
20215
983092f35ff7 8028710: G1 does not retire allocation buffers after reference processing work
tschatzl
parents: 20212
diff changeset
5680
983092f35ff7 8028710: G1 does not retire allocation buffers after reference processing work
tschatzl
parents: 20212
diff changeset
5681 // We have completed copying any necessary live referent objects.
20224
a2328cbebb23 8035401: Fix visibility of G1ParScanThreadState members
tschatzl
parents: 20223
diff changeset
5682 assert(pss.queue_is_empty(), "both queue and overflow should be empty");
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5683
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5684 double ref_proc_time = os::elapsedTime() - ref_proc_start;
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
5685 g1_policy()->phase_times()->record_ref_proc_time(ref_proc_time * 1000.0);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5686 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5687
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5688 // Weak Reference processing during an evacuation pause (part 2).
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5689 void G1CollectedHeap::enqueue_discovered_references(uint no_of_gc_workers) {
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5690 double ref_enq_start = os::elapsedTime();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5691
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5692 ReferenceProcessor* rp = _ref_processor_stw;
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5693 assert(!rp->discovery_enabled(), "should have been disabled as part of processing");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5694
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5695 // Now enqueue any remaining on the discovered lists on to
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5696 // the pending list.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5697 if (!rp->processing_is_mt()) {
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5698 // Serial reference processing...
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5699 rp->enqueue_discovered_references();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5700 } else {
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5701 // Parallel reference enqueueing
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5702
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5703 assert(no_of_gc_workers == workers()->active_workers(),
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5704 "Need to reset active workers");
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5705 assert(rp->num_q() == no_of_gc_workers, "sanity");
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5706 assert(no_of_gc_workers <= rp->max_num_q(), "sanity");
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5707
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5708 G1STWRefProcTaskExecutor par_task_executor(this, workers(), _task_queues, no_of_gc_workers);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5709 rp->enqueue_discovered_references(&par_task_executor);
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5710 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5711
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5712 rp->verify_no_references_recorded();
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5713 assert(!rp->discovery_enabled(), "should have been disabled");
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5714
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5715 // FIXME
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5716 // CM's reference processing also cleans up the string and symbol tables.
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5717 // Should we do that here also? We could, but it is a serial operation
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5718 // and could significantly increase the pause time.
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5719
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5720 double ref_enq_time = os::elapsedTime() - ref_enq_start;
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
5721 g1_policy()->phase_times()->record_ref_enq_time(ref_enq_time * 1000.0);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5722 }
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5723
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5724 void G1CollectedHeap::evacuate_collection_set(EvacuationInfo& evacuation_info) {
4781
bacb651cf5bf 7113006: G1: excessive ergo output when an evac failure happens
tonyp
parents: 4728
diff changeset
5725 _expand_heap_after_alloc_failure = true;
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5726 _evacuation_failed = false;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5727
6629
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5728 // Should G1EvacuationFailureALot be in effect for this GC?
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5729 NOT_PRODUCT(set_evacuation_failure_alot_for_current_gc();)
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5730
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5731 g1_rem_set()->prepare_for_oops_into_collection_set_do();
10246
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5732
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5733 // Disable the hot card cache.
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5734 G1HotCardCache* hot_card_cache = _cg1r->hot_card_cache();
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5735 hot_card_cache->reset_hot_cache_claimed_index();
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5736 hot_card_cache->set_use_cache(false);
889
15c5903cf9e1 6865703: G1: Parallelize hot card cache cleanup
johnc
parents: 884
diff changeset
5737
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5738 uint n_workers;
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5739 if (G1CollectedHeap::use_parallel_gc_threads()) {
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5740 n_workers =
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5741 AdaptiveSizePolicy::calc_active_workers(workers()->total_workers(),
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5742 workers()->active_workers(),
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5743 Threads::number_of_non_daemon_threads());
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5744 assert(UseDynamicNumberOfGCThreads ||
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5745 n_workers == workers()->total_workers(),
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5746 "If not dynamic should be using all the workers");
4711
adedfbbf0360 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 4710
diff changeset
5747 workers()->set_active_workers(n_workers);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5748 set_par_threads(n_workers);
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5749 } else {
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5750 assert(n_par_threads() == 0,
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5751 "Should be the original non-parallel value");
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5752 n_workers = 1;
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5753 }
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5754
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5755
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5756 init_for_evac_failure(NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5757
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5758 rem_set()->prepare_for_younger_refs_iterate(true);
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 595
diff changeset
5759
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 595
diff changeset
5760 assert(dirty_card_queue_set().completed_buffers_num() == 0, "Should be empty");
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5761 double start_par_time_sec = os::elapsedTime();
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5762 double end_par_time_sec;
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5763
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5764 {
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
5765 G1RootProcessor root_processor(this);
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
5766 G1ParTask g1_par_task(this, _task_queues, &root_processor);
20278
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5767 // InitialMark needs claim bits to keep track of the marked-through CLDs.
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5768 if (g1_policy()->during_initial_mark_pause()) {
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5769 ClassLoaderDataGraph::clear_claimed_marks();
2c6ef90f030a 8049421: G1 Class Unloading after completing a concurrent mark cycle
stefank
parents: 20274
diff changeset
5770 }
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5771
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5772 if (G1CollectedHeap::use_parallel_gc_threads()) {
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5773 // The individual threads will set their evac-failure closures.
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5774 if (ParallelGCVerbose) G1ParScanThreadState::print_termination_stats_hdr();
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5775 // These tasks use ShareHeap::_process_strong_tasks
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5776 assert(UseDynamicNumberOfGCThreads ||
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5777 workers()->active_workers() == workers()->total_workers(),
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5778 "If not dynamic should be using all the workers");
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5779 workers()->run_task(&g1_par_task);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5780 } else {
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5781 g1_par_task.set_for_termination(n_workers);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5782 g1_par_task.work(0);
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5783 }
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5784 end_par_time_sec = os::elapsedTime();
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5785
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5786 // Closing the inner scope will execute the destructor
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
5787 // for the G1RootProcessor object. We record the current
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5788 // elapsed time before closing the scope so that time
23224
79b13c9a93e8 8075210: Refactor strong root processing in order to allow G1 to evolve separately from GenCollectedHeap
mgerdin
parents: 23223
diff changeset
5789 // taken for the destructor is NOT included in the
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5790 // reported parallel time.
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5791 }
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5792
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5793 G1GCPhaseTimes* phase_times = g1_policy()->phase_times();
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5794
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5795 double par_time_ms = (end_par_time_sec - start_par_time_sec) * 1000.0;
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5796 phase_times->record_par_time(par_time_ms);
5986
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5797
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5798 double code_root_fixup_time_ms =
500023bd0818 7143511: G1: Another instance of high GC Worker Other time (50ms)
johnc
parents: 5963
diff changeset
5799 (os::elapsedTime() - end_par_time_sec) * 1000.0;
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5800 phase_times->record_code_root_fixup_time(code_root_fixup_time_ms);
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
5801
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5802 set_par_threads(0);
1974
fd1d227ef1b9 6983204: G1: Nightly test nsk/regression/b4958615 failing with +ExplicitGCInvokesConcurrent
johnc
parents: 1973
diff changeset
5803
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5804 // Process any discovered reference objects - we have
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5805 // to do this _before_ we retire the GC alloc regions
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5806 // as we may have to copy some 'reachable' referent
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5807 // objects (and their reachable sub-graphs) that were
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5808 // not copied during the pause.
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5809 process_discovered_references(n_workers);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5810
23222
8e83e6b768b8 8061630: G1 iterates over JNIHandles two times
ehelin
parents: 23220
diff changeset
5811 if (G1StringDedup::is_enabled()) {
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5812 double fixup_start = os::elapsedTime();
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5813
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5814 G1STWIsAliveClosure is_alive(this);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5815 G1KeepAliveClosure keep_alive(this);
23223
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5816 G1StringDedup::unlink_or_oops_do(&is_alive, &keep_alive, true, phase_times);
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5817
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5818 double fixup_time_ms = (os::elapsedTime() - fixup_start) * 1000.0;
8f8f1d578796 8074037: Refactor the G1GCPhaseTime logging to make it easier to add new phases
brutisso
parents: 23222
diff changeset
5819 phase_times->record_string_dedup_fixup_time(fixup_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5820 }
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5821
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
5822 _allocator->release_gc_alloc_regions(n_workers, evacuation_info);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5823 g1_rem_set()->cleanup_after_oops_into_collection_set_do();
616
4f360ec815ba 6720309: G1: don't synchronously update RSet during evacuation pauses
iveresov
parents: 595
diff changeset
5824
10246
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5825 // Reset and re-enable the hot card cache.
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5826 // Note the counts for the cards in the regions in the
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5827 // collection set are reset when the collection set is freed.
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5828 hot_card_cache->reset_hot_cache();
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5829 hot_card_cache->set_use_cache(true);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5830
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
5831 purge_code_root_memory();
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
5832
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
5833 if (g1_policy()->during_initial_mark_pause()) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
5834 // Reset the claim values set during marking the strong code roots
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
5835 reset_heap_region_claim_values();
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
5836 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
5837
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5838 finalize_for_evac_failure();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5839
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5840 if (evacuation_failed()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5841 remove_self_forwarding_pointers();
6629
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5842
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5843 // Reset the G1EvacuationFailureALot counters and flags
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5844 // Note: the values are reset only when an actual
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5845 // evacuation failure occurs.
c9814fadeb38 7041879: G1: introduce stress testing parameter to cause frequent evacuation failures
johnc
parents: 6628
diff changeset
5846 NOT_PRODUCT(reset_evacuation_should_fail();)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5847 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5848
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5849 // Enqueue any remaining references remaining on the STW
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5850 // reference processor's discovered lists. We need to do
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5851 // this after the card table is cleaned (and verified) as
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
5852 // the act of enqueueing entries on to the pending list
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5853 // will log these updates (and dirty their associated
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5854 // cards). We need these updates logged to update any
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5855 // RSets.
6819
2e6857353b2c 8000311: G1: ParallelGCThreads==0 broken
johnc
parents: 6785
diff changeset
5856 enqueue_discovered_references(n_workers);
3979
4dfb2df418f2 6484982: G1: process references during evacuation pauses
johnc
parents: 3973
diff changeset
5857
20504
6948da6d7c13 8052172: Evacuation failure handling in G1 does not evacuate all objects if -XX:-G1DeferredRSUpdate is set
tschatzl
parents: 20503
diff changeset
5858 redirty_logged_cards();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5859 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5860 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5861
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5862 void G1CollectedHeap::free_region(HeapRegion* hr,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5863 FreeRegionList* free_list,
17755
96b1c2e06e25 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 17753
diff changeset
5864 bool par,
96b1c2e06e25 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 17753
diff changeset
5865 bool locked) {
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
5866 assert(!hr->is_free(), "the region should not be free");
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5867 assert(!hr->is_empty(), "the region should not be empty");
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
5868 assert(_hrm.is_available(hr->hrm_index()), "region should be committed");
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5869 assert(free_list != NULL, "pre-condition");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5870
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
5871 if (G1VerifyBitmaps) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
5872 MemRegion mr(hr->bottom(), hr->end());
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
5873 concurrent_mark()->clearRangePrevBitmap(mr);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
5874 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
5875
10246
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5876 // Clear the card counts for this region.
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5877 // Note: we only need to do this if the region is not young
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5878 // (since we don't refine cards in young regions).
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5879 if (!hr->is_young()) {
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5880 _cg1r->hot_card_cache()->reset_card_counts(hr);
194f52aa2f23 7176479: G1: JVM crashes on T5-8 system with 1.5 TB heap
johnc
parents: 10242
diff changeset
5881 }
17755
96b1c2e06e25 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 17753
diff changeset
5882 hr->hr_clear(par, true /* clear_space */, locked /* locked */);
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
5883 free_list->add_ordered(hr);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5884 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5885
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5886 void G1CollectedHeap::free_humongous_region(HeapRegion* hr,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5887 FreeRegionList* free_list,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5888 bool par) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5889 assert(hr->startsHumongous(), "this is only for starts humongous regions");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5890 assert(free_list != NULL, "pre-condition");
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5891
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5892 size_t hr_capacity = hr->capacity();
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
5893 // We need to read this before we make the region non-humongous,
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
5894 // otherwise the information will be gone.
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
5895 uint last_index = hr->last_hc_index();
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
5896 hr->clear_humongous();
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5897 free_region(hr, free_list, par);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5898
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
5899 uint i = hr->hrm_index() + 1;
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
5900 while (i < last_index) {
3766
c3f1170908be 7045330: G1: Simplify/fix the HeapRegionSeq class
tonyp
parents: 3764
diff changeset
5901 HeapRegion* curr_hr = region_at(i);
6254
a2f7274eb6ef 7114678: G1: various small fixes, code cleanup, and refactoring
tonyp
parents: 6220
diff changeset
5902 assert(curr_hr->continuesHumongous(), "invariant");
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
5903 curr_hr->clear_humongous();
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5904 free_region(curr_hr, free_list, par);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5905 i += 1;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5906 }
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5907 }
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5908
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5909 void G1CollectedHeap::remove_from_old_sets(const HeapRegionSetCount& old_regions_removed,
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5910 const HeapRegionSetCount& humongous_regions_removed) {
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5911 if (old_regions_removed.length() > 0 || humongous_regions_removed.length() > 0) {
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5912 MutexLockerEx x(OldSets_lock, Mutex::_no_safepoint_check_flag);
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5913 _old_set.bulk_remove(old_regions_removed);
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5914 _humongous_set.bulk_remove(humongous_regions_removed);
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5915 }
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5916
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5917 }
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5918
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5919 void G1CollectedHeap::prepend_to_freelist(FreeRegionList* list) {
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5920 assert(list != NULL, "list can't be null");
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5921 if (!list->is_empty()) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
5922 MutexLockerEx x(FreeList_lock, Mutex::_no_safepoint_check_flag);
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
5923 _hrm.insert_list_into_free_list(list);
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5924 }
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5925 }
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5926
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
5927 void G1CollectedHeap::decrement_summary_bytes(size_t bytes) {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
5928 _allocator->decrease_used(bytes);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5929 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
5930
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5931 class G1ParCleanupCTTask : public AbstractGangTask {
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5932 G1SATBCardTableModRefBS* _ct_bs;
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5933 G1CollectedHeap* _g1h;
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5934 HeapRegion* volatile _su_head;
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5935 public:
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5936 G1ParCleanupCTTask(G1SATBCardTableModRefBS* ct_bs,
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
5937 G1CollectedHeap* g1h) :
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5938 AbstractGangTask("G1 Par Cleanup CT Task"),
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
5939 _ct_bs(ct_bs), _g1h(g1h) { }
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5940
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
5941 void work(uint worker_id) {
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5942 HeapRegion* r;
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5943 while (r = _g1h->pop_dirty_cards_region()) {
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5944 clear_cards(r);
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5945 }
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5946 }
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5947
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5948 void clear_cards(HeapRegion* r) {
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
5949 // Cards of the survivors should have already been dirtied.
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
5950 if (!r->is_survivor()) {
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5951 _ct_bs->clear(MemRegion(r->bottom(), r->end()));
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5952 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5953 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5954 };
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
5955
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5956 #ifndef PRODUCT
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5957 class G1VerifyCardTableCleanup: public HeapRegionClosure {
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5958 G1CollectedHeap* _g1h;
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5959 G1SATBCardTableModRefBS* _ct_bs;
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5960 public:
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5961 G1VerifyCardTableCleanup(G1CollectedHeap* g1h, G1SATBCardTableModRefBS* ct_bs)
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5962 : _g1h(g1h), _ct_bs(ct_bs) { }
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
5963 virtual bool doHeapRegion(HeapRegion* r) {
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
5964 if (r->is_survivor()) {
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5965 _g1h->verify_dirty_region(r);
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5966 } else {
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5967 _g1h->verify_not_dirty_region(r);
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5968 }
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5969 return false;
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5970 }
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
5971 };
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
5972
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5973 void G1CollectedHeap::verify_not_dirty_region(HeapRegion* hr) {
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5974 // All of the region should be clean.
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5975 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5976 MemRegion mr(hr->bottom(), hr->end());
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5977 ct_bs->verify_not_dirty_region(mr);
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5978 }
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5979
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5980 void G1CollectedHeap::verify_dirty_region(HeapRegion* hr) {
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5981 // We cannot guarantee that [bottom(),end()] is dirty. Threads
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5982 // dirty allocated blocks as they allocate them. The thread that
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5983 // retires each region and replaces it with a new one will do a
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5984 // maximal allocation to fill in [pre_dummy_top(),end()] but will
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5985 // not dirty that area (one less thing to have to do while holding
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5986 // a lock). So we can only verify that [bottom(),pre_dummy_top()]
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5987 // is dirty.
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5988 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5989 MemRegion mr(hr->bottom(), hr->pre_dummy_top());
12835
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12345
diff changeset
5990 if (hr->is_young()) {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12345
diff changeset
5991 ct_bs->verify_g1_young_region(mr);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12345
diff changeset
5992 } else {
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12345
diff changeset
5993 ct_bs->verify_dirty_region(mr);
69944b868a32 8014555: G1: Memory ordering problem with Conc refinement and card marking
mgerdin
parents: 12345
diff changeset
5994 }
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5995 }
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
5996
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
5997 void G1CollectedHeap::verify_dirty_young_list(HeapRegion* head) {
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
5998 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
5999 for (HeapRegion* hr = head; hr != NULL; hr = hr->get_next_young_region()) {
3317
063382f9b575 7035144: G1: nightly failure: Non-dirty cards in region that should be dirty (failures still exist...)
tonyp
parents: 3293
diff changeset
6000 verify_dirty_region(hr);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6001 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6002 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6003
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6004 void G1CollectedHeap::verify_dirty_young_regions() {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6005 verify_dirty_young_list(_young_list->first_region());
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6006 }
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6007
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6008 bool G1CollectedHeap::verify_no_bits_over_tams(const char* bitmap_name, CMBitMapRO* bitmap,
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6009 HeapWord* tams, HeapWord* end) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6010 guarantee(tams <= end,
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6011 err_msg("tams: "PTR_FORMAT" end: "PTR_FORMAT, tams, end));
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6012 HeapWord* result = bitmap->getNextMarkedWordAddress(tams, end);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6013 if (result < end) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6014 gclog_or_tty->cr();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6015 gclog_or_tty->print_cr("## wrong marked address on %s bitmap: "PTR_FORMAT,
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6016 bitmap_name, result);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6017 gclog_or_tty->print_cr("## %s tams: "PTR_FORMAT" end: "PTR_FORMAT,
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6018 bitmap_name, tams, end);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6019 return false;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6020 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6021 return true;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6022 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6023
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6024 bool G1CollectedHeap::verify_bitmaps(const char* caller, HeapRegion* hr) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6025 CMBitMapRO* prev_bitmap = concurrent_mark()->prevMarkBitMap();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6026 CMBitMapRO* next_bitmap = (CMBitMapRO*) concurrent_mark()->nextMarkBitMap();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6027
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6028 HeapWord* bottom = hr->bottom();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6029 HeapWord* ptams = hr->prev_top_at_mark_start();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6030 HeapWord* ntams = hr->next_top_at_mark_start();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6031 HeapWord* end = hr->end();
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6032
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6033 bool res_p = verify_no_bits_over_tams("prev", prev_bitmap, ptams, end);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6034
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6035 bool res_n = true;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6036 // We reset mark_in_progress() before we reset _cmThread->in_progress() and in this window
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6037 // we do the clearing of the next bitmap concurrently. Thus, we can not verify the bitmap
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6038 // if we happen to be in that state.
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6039 if (mark_in_progress() || !_cmThread->in_progress()) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6040 res_n = verify_no_bits_over_tams("next", next_bitmap, ntams, end);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6041 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6042 if (!res_p || !res_n) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6043 gclog_or_tty->print_cr("#### Bitmap verification failed for "HR_FORMAT,
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6044 HR_FORMAT_PARAMS(hr));
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6045 gclog_or_tty->print_cr("#### Caller: %s", caller);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6046 return false;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6047 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6048 return true;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6049 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6050
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6051 void G1CollectedHeap::check_bitmaps(const char* caller, HeapRegion* hr) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6052 if (!G1VerifyBitmaps) return;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6053
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6054 guarantee(verify_bitmaps(caller, hr), "bitmap verification");
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6055 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6056
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6057 class G1VerifyBitmapClosure : public HeapRegionClosure {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6058 private:
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6059 const char* _caller;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6060 G1CollectedHeap* _g1h;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6061 bool _failures;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6062
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6063 public:
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6064 G1VerifyBitmapClosure(const char* caller, G1CollectedHeap* g1h) :
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6065 _caller(caller), _g1h(g1h), _failures(false) { }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6066
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6067 bool failures() { return _failures; }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6068
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6069 virtual bool doHeapRegion(HeapRegion* hr) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6070 if (hr->continuesHumongous()) return false;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6071
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6072 bool result = _g1h->verify_bitmaps(_caller, hr);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6073 if (!result) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6074 _failures = true;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6075 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6076 return false;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6077 }
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6078 };
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6079
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6080 void G1CollectedHeap::check_bitmaps(const char* caller) {
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6081 if (!G1VerifyBitmaps) return;
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6082
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6083 G1VerifyBitmapClosure cl(caller, this);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6084 heap_region_iterate(&cl);
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6085 guarantee(!cl.failures(), "bitmap verification");
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6086 }
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6087
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6088 class G1CheckCSetFastTableClosure : public HeapRegionClosure {
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6089 private:
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6090 bool _failures;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6091 public:
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6092 G1CheckCSetFastTableClosure() : HeapRegionClosure(), _failures(false) { }
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6093
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6094 virtual bool doHeapRegion(HeapRegion* hr) {
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6095 uint i = hr->hrm_index();
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6096 InCSetState cset_state = (InCSetState) G1CollectedHeap::heap()->_in_cset_fast_test.get_by_index(i);
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6097 if (hr->isHumongous()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6098 if (hr->in_collection_set()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6099 gclog_or_tty->print_cr("\n## humongous region %u in CSet", i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6100 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6101 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6102 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6103 if (cset_state.is_in_cset()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6104 gclog_or_tty->print_cr("\n## inconsistent cset state %d for humongous region %u", cset_state.value(), i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6105 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6106 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6107 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6108 if (hr->continuesHumongous() && cset_state.is_humongous()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6109 gclog_or_tty->print_cr("\n## inconsistent cset state %d for continues humongous region %u", cset_state.value(), i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6110 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6111 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6112 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6113 } else {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6114 if (cset_state.is_humongous()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6115 gclog_or_tty->print_cr("\n## inconsistent cset state %d for non-humongous region %u", cset_state.value(), i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6116 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6117 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6118 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6119 if (hr->in_collection_set() != cset_state.is_in_cset()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6120 gclog_or_tty->print_cr("\n## in CSet %d / cset state %d inconsistency for region %u",
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6121 hr->in_collection_set(), cset_state.value(), i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6122 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6123 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6124 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6125 if (cset_state.is_in_cset()) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6126 if (hr->is_young() != (cset_state.is_young())) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6127 gclog_or_tty->print_cr("\n## is_young %d / cset state %d inconsistency for region %u",
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6128 hr->is_young(), cset_state.value(), i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6129 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6130 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6131 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6132 if (hr->is_old() != (cset_state.is_old())) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6133 gclog_or_tty->print_cr("\n## is_old %d / cset state %d inconsistency for region %u",
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6134 hr->is_old(), cset_state.value(), i);
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6135 _failures = true;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6136 return true;
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6137 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6138 }
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6139 }
22923
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6140 return false;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6141 }
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6142
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6143 bool failures() const { return _failures; }
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6144 };
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6145
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6146 bool G1CollectedHeap::check_cset_fast_test() {
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6147 G1CheckCSetFastTableClosure cl;
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6148 _hrm.iterate(&cl);
c04f46b4abe4 8068036: assert(is_available(index)) failed in G1 cset
tschatzl
parents: 22909
diff changeset
6149 return !cl.failures();
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6150 }
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6151 #endif // PRODUCT
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
6152
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6153 void G1CollectedHeap::cleanUpCardTable() {
12343
d55c004e1d4d 8025305: Cleanup CardTableModRefBS usage in G1
mgerdin
parents: 12339
diff changeset
6154 G1SATBCardTableModRefBS* ct_bs = g1_barrier_set();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6155 double start = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6156
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6157 {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6158 // Iterate over the dirty cards region list.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6159 G1ParCleanupCTTask cleanup_task(ct_bs, this);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6160
4711
adedfbbf0360 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 4710
diff changeset
6161 if (G1CollectedHeap::use_parallel_gc_threads()) {
adedfbbf0360 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 4710
diff changeset
6162 set_par_threads();
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6163 workers()->run_task(&cleanup_task);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6164 set_par_threads(0);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6165 } else {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6166 while (_dirty_cards_region_list) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6167 HeapRegion* r = _dirty_cards_region_list;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6168 cleanup_task.clear_cards(r);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6169 _dirty_cards_region_list = r->get_next_dirty_cards_region();
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6170 if (_dirty_cards_region_list == r) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6171 // The last region.
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6172 _dirty_cards_region_list = NULL;
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6173 }
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6174 r->set_next_dirty_cards_region(NULL);
796
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
6175 }
29e7d79232b9 6819065: G1: eliminate high serial card table clearing time
apetrusenko
parents: 794
diff changeset
6176 }
4023
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6177 #ifndef PRODUCT
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6178 if (G1VerifyCTCleanup || VerifyAfterGC) {
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6179 G1VerifyCardTableCleanup cleanup_verifier(this, ct_bs);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6180 heap_region_iterate(&cleanup_verifier);
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6181 }
c6a6e936dc68 7096030: G1: PrintGCDetails enhancements
johnc
parents: 4014
diff changeset
6182 #endif
940
8624da129f0b 6841313: G1: dirty cards of survivor regions in parallel
apetrusenko
parents: 936
diff changeset
6183 }
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6184
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6185 double elapsed = os::elapsedTime() - start;
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
6186 g1_policy()->phase_times()->record_clear_ct_time(elapsed * 1000.0);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6187 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6188
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
6189 void G1CollectedHeap::free_collection_set(HeapRegion* cs_head, EvacuationInfo& evacuation_info) {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6190 size_t pre_used = 0;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6191 FreeRegionList local_free_list("Local List for CSet Freeing");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6192
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6193 double young_time_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6194 double non_young_time_ms = 0.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6195
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6196 // Since the collection set is a superset of the the young list,
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6197 // all we need to do to clear the young list is clear its
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6198 // head and length, and unlink any young regions in the code below
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6199 _young_list->clear();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6200
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6201 G1CollectorPolicy* policy = g1_policy();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6202
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6203 double start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6204 bool non_young = true;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6205
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6206 HeapRegion* cur = cs_head;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6207 int age_bound = -1;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6208 size_t rs_lengths = 0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6209
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6210 while (cur != NULL) {
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
6211 assert(!is_on_master_free_list(cur), "sanity");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6212 if (non_young) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6213 if (cur->is_young()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6214 double end_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6215 double elapsed_ms = (end_sec - start_sec) * 1000.0;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6216 non_young_time_ms += elapsed_ms;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6217
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6218 start_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6219 non_young = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6220 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6221 } else {
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6222 if (!cur->is_young()) {
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6223 double end_sec = os::elapsedTime();
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6224 double elapsed_ms = (end_sec - start_sec) * 1000.0;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6225 young_time_ms += elapsed_ms;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6226
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6227 start_sec = os::elapsedTime();
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6228 non_young = true;
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6229 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6230 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6231
17755
96b1c2e06e25 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 17753
diff changeset
6232 rs_lengths += cur->rem_set()->occupied_locked();
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6233
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6234 HeapRegion* next = cur->next_in_collection_set();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6235 assert(cur->in_collection_set(), "bad CS");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6236 cur->set_next_in_collection_set(NULL);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6237 cur->set_in_collection_set(false);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6238
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6239 if (cur->is_young()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6240 int index = cur->young_index_in_cset();
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
6241 assert(index != -1, "invariant");
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
6242 assert((uint) index < policy->young_cset_region_length(), "invariant");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6243 size_t words_survived = _surviving_young_words[index];
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6244 cur->record_surv_words_in_group(words_survived);
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6245
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6246 // At this point the we have 'popped' cur from the collection set
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6247 // (linked via next_in_collection_set()) but it is still in the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6248 // young list (linked via next_young_region()). Clear the
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6249 // _next_young_region field.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6250 cur->set_next_young_region(NULL);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6251 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6252 int index = cur->young_index_in_cset();
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
6253 assert(index == -1, "invariant");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6254 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6255
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6256 assert( (cur->is_young() && cur->young_index_in_cset() > -1) ||
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6257 (!cur->is_young() && cur->young_index_in_cset() == -1),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6258 "invariant" );
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6259
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6260 if (!cur->evacuation_failed()) {
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6261 MemRegion used_mr = cur->used_region();
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6262
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6263 // And the region is empty.
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6264 assert(!used_mr.is_empty(), "Should not have empty regions in a CS.");
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6265 pre_used += cur->used();
17755
96b1c2e06e25 8027295: Free CSet takes ~50% of young pause time
tschatzl
parents: 17753
diff changeset
6266 free_region(cur, &local_free_list, false /* par */, true /* locked */);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6267 } else {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6268 cur->uninstall_surv_rate_group();
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
6269 if (cur->is_young()) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6270 cur->set_young_index_in_cset(-1);
4090
a88de71c4e3a 7097002: G1: remove a lot of unused / redundant code from the G1CollectorPolicy class
tonyp
parents: 4073
diff changeset
6271 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6272 cur->set_evacuation_failed(false);
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6273 // The region is now considered to be old.
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6274 cur->set_old();
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6275 _old_set.add(cur);
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
6276 evacuation_info.increment_collectionset_used_after(cur->used());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6277 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6278 cur = next;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6279 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6280
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10373
diff changeset
6281 evacuation_info.set_regions_freed(local_free_list.length());
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6282 policy->record_max_rs_lengths(rs_lengths);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6283 policy->cset_regions_freed();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6284
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6285 double end_sec = os::elapsedTime();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6286 double elapsed_ms = (end_sec - start_sec) * 1000.0;
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6287
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6288 if (non_young) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6289 non_young_time_ms += elapsed_ms;
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6290 } else {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6291 young_time_ms += elapsed_ms;
4097
dc467e8b2c5e 7112743: G1: Reduce overhead of marking closure during evacuation pauses
johnc
parents: 4095
diff changeset
6292 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6293
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6294 prepend_to_freelist(&local_free_list);
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6295 decrement_summary_bytes(pre_used);
6219
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
6296 policy->phase_times()->record_young_free_cset_time_ms(young_time_ms);
922993931b3d 7178361: G1: Make sure that PrintGC and PrintGCDetails use the same timing for the GC pause
brutisso
parents: 6188
diff changeset
6297 policy->phase_times()->record_non_young_free_cset_time_ms(non_young_time_ms);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6298 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6299
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6300 class G1FreeHumongousRegionClosure : public HeapRegionClosure {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6301 private:
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6302 FreeRegionList* _free_region_list;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6303 HeapRegionSet* _proxy_set;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6304 HeapRegionSetCount _humongous_regions_removed;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6305 size_t _freed_bytes;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6306 public:
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6307
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6308 G1FreeHumongousRegionClosure(FreeRegionList* free_region_list) :
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6309 _free_region_list(free_region_list), _humongous_regions_removed(), _freed_bytes(0) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6310 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6311
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6312 virtual bool doHeapRegion(HeapRegion* r) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6313 if (!r->startsHumongous()) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6314 return false;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6315 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6316
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6317 G1CollectedHeap* g1h = G1CollectedHeap::heap();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6318
20307
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6319 oop obj = (oop)r->bottom();
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6320 CMBitMap* next_bitmap = g1h->concurrent_mark()->nextMarkBitMap();
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6321
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6322 // The following checks whether the humongous object is live are sufficient.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6323 // The main additional check (in addition to having a reference from the roots
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6324 // or the young gen) is whether the humongous object has a remembered set entry.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6325 //
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6326 // A humongous object cannot be live if there is no remembered set for it
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6327 // because:
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6328 // - there can be no references from within humongous starts regions referencing
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6329 // the object because we never allocate other objects into them.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6330 // (I.e. there are no intra-region references that may be missed by the
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6331 // remembered set)
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6332 // - as soon there is a remembered set entry to the humongous starts region
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6333 // (i.e. it has "escaped" to an old object) this remembered set entry will stay
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6334 // until the end of a concurrent mark.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6335 //
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6336 // It is not required to check whether the object has been found dead by marking
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6337 // or not, in fact it would prevent reclamation within a concurrent cycle, as
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6338 // all objects allocated during that time are considered live.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6339 // SATB marking is even more conservative than the remembered set.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6340 // So if at this point in the collection there is no remembered set entry,
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6341 // nobody has a reference to it.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6342 // At the start of collection we flush all refinement logs, and remembered sets
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6343 // are completely up-to-date wrt to references to the humongous object.
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6344 //
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6345 // Other implementation considerations:
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6346 // - never consider object arrays at this time because they would pose
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6347 // considerable effort for cleaning up the the remembered sets. This is
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6348 // required because stale remembered sets might reference locations that
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6349 // are currently allocated into.
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6350 uint region_idx = r->hrm_index();
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6351 if (!g1h->is_humongous_reclaim_candidate(region_idx) ||
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6352 !r->rem_set()->is_empty()) {
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6353
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6354 if (G1TraceEagerReclaimHumongousObjects) {
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6355 gclog_or_tty->print_cr("Live humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d reclaim candidate %d type array %d",
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6356 region_idx,
22894
2af69bed8db6 8058801: G1TraceReclaimDeadHumongousObjectsAtYoungGC only prints humongous object liveness output when there is at least one candidate humongous object
tschatzl
parents: 22862
diff changeset
6357 obj->size()*HeapWordSize,
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6358 r->bottom(),
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6359 r->region_num(),
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6360 r->rem_set()->occupied(),
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6361 r->rem_set()->strong_code_roots_list_length(),
20307
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6362 next_bitmap->isMarked(r->bottom()),
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6363 g1h->is_humongous_reclaim_candidate(region_idx),
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6364 obj->is_typeArray()
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6365 );
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6366 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6367
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6368 return false;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6369 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6370
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6371 guarantee(obj->is_typeArray(),
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6372 err_msg("Only eagerly reclaiming type arrays is supported, but the object "
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6373 PTR_FORMAT " is not.",
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6374 r->bottom()));
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6375
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6376 if (G1TraceEagerReclaimHumongousObjects) {
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6377 gclog_or_tty->print_cr("Dead humongous region %u size "SIZE_FORMAT" start "PTR_FORMAT" length "UINT32_FORMAT" with remset "SIZE_FORMAT" code roots "SIZE_FORMAT" is marked %d reclaim candidate %d type array %d",
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6378 region_idx,
22894
2af69bed8db6 8058801: G1TraceReclaimDeadHumongousObjectsAtYoungGC only prints humongous object liveness output when there is at least one candidate humongous object
tschatzl
parents: 22862
diff changeset
6379 obj->size()*HeapWordSize,
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6380 r->bottom(),
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6381 r->region_num(),
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6382 r->rem_set()->occupied(),
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6383 r->rem_set()->strong_code_roots_list_length(),
20307
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6384 next_bitmap->isMarked(r->bottom()),
23026
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6385 g1h->is_humongous_reclaim_candidate(region_idx),
b7c8142a9e0b 8069367: Eagerly reclaimed humongous objects left on mark stack
kbarrett
parents: 23024
diff changeset
6386 obj->is_typeArray()
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6387 );
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6388 }
20307
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6389 // Need to clear mark bit of the humongous object if already set.
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6390 if (next_bitmap->isMarked(r->bottom())) {
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6391 next_bitmap->clear(r->bottom());
04d77ac27223 8051973: Eager reclaim leaves marks of marked but reclaimed objects on the next bitmap
tschatzl
parents: 20305
diff changeset
6392 }
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6393 _freed_bytes += r->used();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6394 r->set_containing_set(NULL);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6395 _humongous_regions_removed.increment(1u, r->capacity());
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6396 g1h->free_humongous_region(r, _free_region_list, false);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6397
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6398 return false;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6399 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6400
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6401 HeapRegionSetCount& humongous_free_count() {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6402 return _humongous_regions_removed;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6403 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6404
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6405 size_t bytes_freed() const {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6406 return _freed_bytes;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6407 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6408
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6409 size_t humongous_reclaimed() const {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6410 return _humongous_regions_removed.length();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6411 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6412 };
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6413
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6414 void G1CollectedHeap::eagerly_reclaim_humongous_regions() {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6415 assert_at_safepoint(true);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6416
23024
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6417 if (!G1EagerReclaimHumongousObjects ||
cbc7c4c9e11c 8048179: Early reclaim of large objects that are referenced by a few objects
tschatzl
parents: 22978
diff changeset
6418 (!_has_humongous_reclaim_candidates && !G1TraceEagerReclaimHumongousObjects)) {
20305
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6419 g1_policy()->phase_times()->record_fast_reclaim_humongous_time_ms(0.0, 0);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6420 return;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6421 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6422
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6423 double start_time = os::elapsedTime();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6424
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6425 FreeRegionList local_cleanup_list("Local Humongous Cleanup List");
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6426
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6427 G1FreeHumongousRegionClosure cl(&local_cleanup_list);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6428 heap_region_iterate(&cl);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6429
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6430 HeapRegionSetCount empty_set;
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6431 remove_from_old_sets(empty_set, cl.humongous_free_count());
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6432
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6433 G1HRPrinter* hr_printer = _g1h->hr_printer();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6434 if (hr_printer->is_active()) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6435 FreeRegionListIterator iter(&local_cleanup_list);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6436 while (iter.more_available()) {
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6437 HeapRegion* hr = iter.get_next();
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6438 hr_printer->cleanup(hr);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6439 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6440 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6441
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6442 prepend_to_freelist(&local_cleanup_list);
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6443 decrement_summary_bytes(cl.bytes_freed());
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6444
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6445 g1_policy()->phase_times()->record_fast_reclaim_humongous_time_ms((os::elapsedTime() - start_time) * 1000.0,
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6446 cl.humongous_reclaimed());
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6447 }
755930f931e3 8027959: Early reclamation of large objects in G1
tschatzl
parents: 20304
diff changeset
6448
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6449 // This routine is similar to the above but does not record
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6450 // any policy statistics or update free lists; we are abandoning
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6451 // the current incremental collection set in preparation of a
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6452 // full collection. After the full GC we will start to build up
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6453 // the incremental collection set again.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6454 // This is only called when we're doing a full collection
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6455 // and is immediately followed by the tearing down of the young list.
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6456
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6457 void G1CollectedHeap::abandon_collection_set(HeapRegion* cs_head) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6458 HeapRegion* cur = cs_head;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6459
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6460 while (cur != NULL) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6461 HeapRegion* next = cur->next_in_collection_set();
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6462 assert(cur->in_collection_set(), "bad CS");
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6463 cur->set_next_in_collection_set(NULL);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6464 cur->set_in_collection_set(false);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6465 cur->set_young_index_in_cset(-1);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6466 cur = next;
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6467 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6468 }
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6469
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6470 void G1CollectedHeap::set_free_regions_coming() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6471 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6472 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6473 "setting free regions coming");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6474 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6475
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6476 assert(!free_regions_coming(), "pre-condition");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6477 _free_regions_coming = true;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6478 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6479
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6480 void G1CollectedHeap::reset_free_regions_coming() {
4837
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
6481 assert(free_regions_coming(), "pre-condition");
eff609af17d7 7127706: G1: re-enable survivors during the initial-mark pause
tonyp
parents: 4836
diff changeset
6482
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6483 {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6484 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6485 _free_regions_coming = false;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6486 SecondaryFreeList_lock->notify_all();
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6487 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6488
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6489 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6490 gclog_or_tty->print_cr("G1ConcRegionFreeing [cm thread] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6491 "reset free regions coming");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6492 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6493 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6494
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6495 void G1CollectedHeap::wait_while_free_regions_coming() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6496 // Most of the time we won't have to wait, so let's do a quick test
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6497 // first before we take the lock.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6498 if (!free_regions_coming()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6499 return;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6500 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6501
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6502 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6503 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6504 "waiting for free regions");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6505 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6506
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6507 {
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6508 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6509 while (free_regions_coming()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6510 SecondaryFreeList_lock->wait(Mutex::_no_safepoint_check_flag);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6511 }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6512 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6513
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6514 if (G1ConcRegionFreeingVerbose) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6515 gclog_or_tty->print_cr("G1ConcRegionFreeing [other] : "
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6516 "done waiting for free regions");
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6517 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6518 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6519
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6520 void G1CollectedHeap::set_region_short_lived_locked(HeapRegion* hr) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6521 assert(heap_lock_held_for_gc(),
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6522 "the heap lock should already be held by or for this thread");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6523 _young_list->push_region(hr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6524 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6525
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6526 class NoYoungRegionsClosure: public HeapRegionClosure {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6527 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6528 bool _success;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6529 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6530 NoYoungRegionsClosure() : _success(true) { }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6531 bool doHeapRegion(HeapRegion* r) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6532 if (r->is_young()) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6533 gclog_or_tty->print_cr("Region ["PTR_FORMAT", "PTR_FORMAT") tagged as young",
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6534 r->bottom(), r->end());
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6535 _success = false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6536 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6537 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6538 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6539 bool success() { return _success; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6540 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6541
1394
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6542 bool G1CollectedHeap::check_young_list_empty(bool check_heap, bool check_sample) {
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6543 bool ret = _young_list->check_list_empty(check_sample);
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6544
1316cec51b4d 6819061: G1: eliminate serial Other times that are proportional to the collection set length
johnc
parents: 1391
diff changeset
6545 if (check_heap) {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6546 NoYoungRegionsClosure closure;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6547 heap_region_iterate(&closure);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6548 ret = ret && closure.success();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6549 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6550
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6551 return ret;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6552 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6553
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6554 class TearDownRegionSetsClosure : public HeapRegionClosure {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6555 private:
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6556 HeapRegionSet *_old_set;
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6557
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6558 public:
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6559 TearDownRegionSetsClosure(HeapRegionSet* old_set) : _old_set(old_set) { }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6560
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6561 bool doHeapRegion(HeapRegion* r) {
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6562 if (r->is_old()) {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6563 _old_set->remove(r);
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6564 } else {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6565 // We ignore free regions, we'll empty the free list afterwards.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6566 // We ignore young regions, we'll empty the young list afterwards.
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6567 // We ignore humongous regions, we're not tearing down the
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6568 // humongous regions set.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6569 assert(r->is_free() || r->is_young() || r->isHumongous(),
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6570 "it cannot be another type");
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6571 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6572 return false;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6573 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6574
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6575 ~TearDownRegionSetsClosure() {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6576 assert(_old_set->is_empty(), "post-condition");
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6577 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6578 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6579
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6580 void G1CollectedHeap::tear_down_region_sets(bool free_list_only) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6581 assert_at_safepoint(true /* should_be_vm_thread */);
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6582
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6583 if (!free_list_only) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6584 TearDownRegionSetsClosure cl(&_old_set);
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6585 heap_region_iterate(&cl);
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6586
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6587 // Note that emptying the _young_list is postponed and instead done as
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6588 // the first step when rebuilding the regions sets again. The reason for
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6589 // this is that during a full GC string deduplication needs to know if
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6590 // a collected region was young or old when the full GC was initiated.
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6591 }
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6592 _hrm.remove_all_free_regions();
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6593 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6594
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6595 class RebuildRegionSetsClosure : public HeapRegionClosure {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6596 private:
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6597 bool _free_list_only;
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6598 HeapRegionSet* _old_set;
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6599 HeapRegionManager* _hrm;
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6600 size_t _total_used;
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6601
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6602 public:
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6603 RebuildRegionSetsClosure(bool free_list_only,
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6604 HeapRegionSet* old_set, HeapRegionManager* hrm) :
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6605 _free_list_only(free_list_only),
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6606 _old_set(old_set), _hrm(hrm), _total_used(0) {
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6607 assert(_hrm->num_free_regions() == 0, "pre-condition");
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6608 if (!free_list_only) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6609 assert(_old_set->is_empty(), "pre-condition");
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6610 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6611 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6612
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6613 bool doHeapRegion(HeapRegion* r) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6614 if (r->continuesHumongous()) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6615 return false;
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6616 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6617
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6618 if (r->is_empty()) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6619 // Add free regions to the free list
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6620 r->set_free();
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6621 r->set_allocation_context(AllocationContext::system());
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6622 _hrm->insert_into_free_list(r);
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6623 } else if (!_free_list_only) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6624 assert(!r->is_young(), "we should not come across young regions");
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6625
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6626 if (r->isHumongous()) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6627 // We ignore humongous regions, we left the humongous set unchanged
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6628 } else {
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6629 // Objects that were compacted would have ended up on regions
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6630 // that were previously old or free.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6631 assert(r->is_free() || r->is_old(), "invariant");
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6632 // We now consider them old, so register as such.
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6633 r->set_old();
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6634 _old_set->add(r);
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6635 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6636 _total_used += r->used();
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6637 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6638
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6639 return false;
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6640 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6641
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6642 size_t total_used() {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6643 return _total_used;
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6644 }
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6645 };
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6646
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6647 void G1CollectedHeap::rebuild_region_sets(bool free_list_only) {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6648 assert_at_safepoint(true /* should_be_vm_thread */);
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6649
17764
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6650 if (!free_list_only) {
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6651 _young_list->empty_list();
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6652 }
595c0f60d50d 8029075: String deduplication in G1
pliden
parents: 17759
diff changeset
6653
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6654 RebuildRegionSetsClosure cl(free_list_only, &_old_set, &_hrm);
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6655 heap_region_iterate(&cl);
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6656
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6657 if (!free_list_only) {
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6658 _allocator->set_used(cl.total_used());
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6659 }
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6660 assert(_allocator->used_unlocked() == recalculate_used(),
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6661 err_msg("inconsistent _allocator->used_unlocked(), "
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6662 "value: "SIZE_FORMAT" recalculated: "SIZE_FORMAT,
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6663 _allocator->used_unlocked(), recalculate_used()));
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6664 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6665
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6666 void G1CollectedHeap::set_refine_cte_cl_concurrency(bool concurrent) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6667 _refine_cte_cl->set_concurrent(concurrent);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6668 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6669
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6670 bool G1CollectedHeap::is_in_closed_subset(const void* p) const {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6671 HeapRegion* hr = heap_region_containing(p);
20335
eec72fa4b108 8040722: G1: Clean up usages of heap_region_containing
brutisso
parents: 20334
diff changeset
6672 return hr->is_in(p);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6673 }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6674
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6675 // Methods for the mutator alloc region
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6676
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6677 HeapRegion* G1CollectedHeap::new_mutator_alloc_region(size_t word_size,
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6678 bool force) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6679 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6680 assert(!force || g1_policy()->can_expand_young_list(),
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6681 "if force is true we should be able to expand the young list");
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
6682 bool young_list_full = g1_policy()->is_young_list_full();
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
6683 if (force || !young_list_full) {
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6684 HeapRegion* new_alloc_region = new_region(word_size,
17773
8ee855b4e667 8036025: Sort the freelist in order to shrink the heap
jwilhelm
parents: 17759
diff changeset
6685 false /* is_old */,
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6686 false /* do_expand */);
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6687 if (new_alloc_region != NULL) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6688 set_region_short_lived_locked(new_alloc_region);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
6689 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Eden, young_list_full);
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6690 check_bitmaps("Mutator Region Allocation", new_alloc_region);
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6691 return new_alloc_region;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6692 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6693 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6694 return NULL;
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6695 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6696
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6697 void G1CollectedHeap::retire_mutator_alloc_region(HeapRegion* alloc_region,
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6698 size_t allocated_bytes) {
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6699 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6700 assert(alloc_region->is_eden(), "all mutator alloc regions should be eden");
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6701
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6702 g1_policy()->add_region_to_incremental_cset_lhs(alloc_region);
20404
227a9e5e4b4a 8057536: Refactor G1 to allow context specific allocations
sjohanss
parents: 20377
diff changeset
6703 _allocator->increase_used(allocated_bytes);
3778
5f6f2615433a 7049999: G1: Make the G1PrintHeapRegions output consistent and complete
tonyp
parents: 3777
diff changeset
6704 _hr_printer.retire(alloc_region);
3980
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
6705 // We update the eden sizes here, when the region is retired,
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
6706 // instead of when it's allocated, since this is the point that its
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
6707 // used space has been recored in _summary_bytes_used.
8229bd737950 7075646: G1: fix inconsistencies in the monitoring data
tonyp
parents: 3979
diff changeset
6708 g1mm()->update_eden_size();
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6709 }
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6710
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6711 void G1CollectedHeap::set_par_threads() {
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6712 // Don't change the number of workers. Use the value previously set
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6713 // in the workgroup.
4711
adedfbbf0360 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 4710
diff changeset
6714 assert(G1CollectedHeap::use_parallel_gc_threads(), "shouldn't be here otherwise");
4728
441e946dc1af 7121618: Change type of number of GC workers to unsigned int.
jmasa
parents: 4711
diff changeset
6715 uint n_workers = workers()->active_workers();
4711
adedfbbf0360 7120038: G1: ParallelGCThreads==0 is broken
johnc
parents: 4710
diff changeset
6716 assert(UseDynamicNumberOfGCThreads ||
4095
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6717 n_workers == workers()->total_workers(),
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6718 "Otherwise should be using the total number of workers");
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6719 if (n_workers == 0) {
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6720 assert(false, "Should have been set in prior evacuation pause.");
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6721 n_workers = ParallelGCThreads;
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6722 workers()->set_active_workers(n_workers);
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6723 }
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6724 set_par_threads(n_workers);
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6725 }
bca17e38de00 6593758: RFE: Enhance GC ergonomics to dynamically choose ParallelGCThreads
jmasa
parents: 4090
diff changeset
6726
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6727 // Methods for the GC alloc regions
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6728
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6729 HeapRegion* G1CollectedHeap::new_gc_alloc_region(size_t word_size,
6010
720b6a76dd9d 7157073: G1: type change size_t -> uint for region counts / indexes
tonyp
parents: 6008
diff changeset
6730 uint count,
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6731 InCSetState dest) {
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6732 assert(FreeList_lock->owned_by_self(), "pre-condition");
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6733
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6734 if (count < g1_policy()->max_regions(dest)) {
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6735 const bool is_survivor = (dest.is_young());
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6736 HeapRegion* new_alloc_region = new_region(word_size,
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6737 !is_survivor,
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6738 true /* do_expand */);
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6739 if (new_alloc_region != NULL) {
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6740 // We really only need to do this for old regions given that we
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6741 // should never scan survivors. But it doesn't hurt to do it
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6742 // for survivors too.
22897
80ac3ee51955 8065358: Refactor G1s usage of save_marks and reduce related races
mgerdin
parents: 22895
diff changeset
6743 new_alloc_region->record_timestamp();
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6744 if (is_survivor) {
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6745 new_alloc_region->set_survivor();
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6746 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Survivor);
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6747 check_bitmaps("Survivor Region Allocation", new_alloc_region);
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6748 } else {
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6749 new_alloc_region->set_old();
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6750 _hr_printer.alloc(new_alloc_region, G1HRPrinter::Old);
20291
e0954897238a 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
brutisso
parents: 20282
diff changeset
6751 check_bitmaps("Old Region Allocation", new_alloc_region);
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6752 }
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
6753 bool during_im = g1_policy()->during_initial_mark_pause();
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
6754 new_alloc_region->note_start_of_copying(during_im);
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6755 return new_alloc_region;
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6756 }
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6757 }
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6758 return NULL;
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6759 }
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6760
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6761 void G1CollectedHeap::retire_gc_alloc_region(HeapRegion* alloc_region,
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6762 size_t allocated_bytes,
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6763 InCSetState dest) {
4787
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
6764 bool during_im = g1_policy()->during_initial_mark_pause();
2ace1c4ee8da 6888336: G1: avoid explicitly marking and pushing objects in survivor spaces
tonyp
parents: 4785
diff changeset
6765 alloc_region->note_end_of_copying(during_im);
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6766 g1_policy()->record_bytes_copied_during_gc(allocated_bytes);
22901
c132be0fb74d 8060025: Object copy time regressions after JDK-8031323 and JDK-8057536
tschatzl
parents: 22898
diff changeset
6767 if (dest.is_young()) {
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6768 young_list()->add_survivor_region(alloc_region);
4072
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6769 } else {
8aae2050e83e 7092309: G1: introduce old region set
tonyp
parents: 4023
diff changeset
6770 _old_set.add(alloc_region);
3830
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6771 }
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6772 _hr_printer.retire(alloc_region);
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6773 }
f44782f04dd4 7039627: G1: avoid BOT updates for survivor allocations and dirty survivor regions incrementally
tonyp
parents: 3824
diff changeset
6774
2433
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6775 // Heap region set verification
abdfc822206f 7023069: G1: Introduce symmetric locking in the slow allocation path
tonyp
parents: 2432
diff changeset
6776
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6777 class VerifyRegionListsClosure : public HeapRegionClosure {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6778 private:
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6779 HeapRegionSet* _old_set;
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6780 HeapRegionSet* _humongous_set;
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6781 HeapRegionManager* _hrm;
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6782
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6783 public:
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6784 HeapRegionSetCount _old_count;
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6785 HeapRegionSetCount _humongous_count;
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6786 HeapRegionSetCount _free_count;
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6787
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6788 VerifyRegionListsClosure(HeapRegionSet* old_set,
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6789 HeapRegionSet* humongous_set,
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6790 HeapRegionManager* hrm) :
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6791 _old_set(old_set), _humongous_set(humongous_set), _hrm(hrm),
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6792 _old_count(), _humongous_count(), _free_count(){ }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6793
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6794 bool doHeapRegion(HeapRegion* hr) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6795 if (hr->continuesHumongous()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6796 return false;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6797 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6798
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6799 if (hr->is_young()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6800 // TODO
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6801 } else if (hr->startsHumongous()) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6802 assert(hr->containing_set() == _humongous_set, err_msg("Heap region %u is starts humongous but not in humongous set.", hr->hrm_index()));
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6803 _humongous_count.increment(1u, hr->capacity());
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6804 } else if (hr->is_empty()) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6805 assert(_hrm->is_free(hr), err_msg("Heap region %u is empty but not on the free list.", hr->hrm_index()));
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6806 _free_count.increment(1u, hr->capacity());
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6807 } else if (hr->is_old()) {
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6808 assert(hr->containing_set() == _old_set, err_msg("Heap region %u is old but not in the old set.", hr->hrm_index()));
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6809 _old_count.increment(1u, hr->capacity());
20481
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6810 } else {
c02ec279b062 8057768: Make heap region region type in G1 HeapRegion explicit
brutisso
parents: 20445
diff changeset
6811 ShouldNotReachHere();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6812 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6813 return false;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6814 }
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6815
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6816 void verify_counts(HeapRegionSet* old_set, HeapRegionSet* humongous_set, HeapRegionManager* free_list) {
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6817 guarantee(old_set->length() == _old_count.length(), err_msg("Old set count mismatch. Expected %u, actual %u.", old_set->length(), _old_count.length()));
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6818 guarantee(old_set->total_capacity_bytes() == _old_count.capacity(), err_msg("Old set capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT,
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6819 old_set->total_capacity_bytes(), _old_count.capacity()));
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6820
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6821 guarantee(humongous_set->length() == _humongous_count.length(), err_msg("Hum set count mismatch. Expected %u, actual %u.", humongous_set->length(), _humongous_count.length()));
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6822 guarantee(humongous_set->total_capacity_bytes() == _humongous_count.capacity(), err_msg("Hum set capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT,
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6823 humongous_set->total_capacity_bytes(), _humongous_count.capacity()));
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6824
20336
6701abbc4441 8054818: Refactor HeapRegionSeq to manage heap region and auxiliary data
tschatzl
parents: 20335
diff changeset
6825 guarantee(free_list->num_free_regions() == _free_count.length(), err_msg("Free list count mismatch. Expected %u, actual %u.", free_list->num_free_regions(), _free_count.length()));
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6826 guarantee(free_list->total_capacity_bytes() == _free_count.capacity(), err_msg("Free list capacity mismatch. Expected " SIZE_FORMAT ", actual " SIZE_FORMAT,
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6827 free_list->total_capacity_bytes(), _free_count.capacity()));
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6828 }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6829 };
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6830
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6831 void G1CollectedHeap::verify_region_sets() {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6832 assert_heap_locked_or_at_safepoint(true /* should_be_vm_thread */);
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6833
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6834 // First, check the explicit lists.
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6835 _hrm.verify();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6836 {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6837 // Given that a concurrent operation might be adding regions to
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6838 // the secondary free list we have to take the lock before
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6839 // verifying it.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6840 MutexLockerEx x(SecondaryFreeList_lock, Mutex::_no_safepoint_check_flag);
17736
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6841 _secondary_free_list.verify_list();
58fc1b1523dc 8034079: G1: Refactor the HeapRegionSet hierarchy
brutisso
parents: 17727
diff changeset
6842 }
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6843
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6844 // If a concurrent region freeing operation is in progress it will
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6845 // be difficult to correctly attributed any free regions we come
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6846 // across to the correct free list given that they might belong to
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6847 // one of several (free_list, secondary_free_list, any local lists,
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6848 // etc.). So, if that's the case we will skip the rest of the
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6849 // verification operation. Alternatively, waiting for the concurrent
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6850 // operation to complete will have a non-trivial effect on the GC's
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6851 // operation (no concurrent operation will last longer than the
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6852 // interval between two calls to verification) and it might hide
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6853 // any issues that we would like to catch during testing.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6854 if (free_regions_coming()) {
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6855 return;
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6856 }
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6857
2361
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
6858 // Make sure we append the secondary_free_list on the free_list so
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
6859 // that all free regions we will come across can be safely
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
6860 // attributed to the free_list.
1216415d8e35 7014923: G1: code cleanup
tonyp
parents: 2311
diff changeset
6861 append_secondary_free_list_if_not_empty_with_lock();
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6862
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6863 // Finally, make sure that the region accounting in the lists is
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6864 // consistent with what we see in the heap.
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6865
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6866 VerifyRegionListsClosure cl(&_old_set, &_humongous_set, &_hrm);
2152
0fa27f37d4d4 6977804: G1: remove the zero-filling thread
tonyp
parents: 2137
diff changeset
6867 heap_region_iterate(&cl);
20377
a8ea2f110d87 8054819: Rename HeapRegionSeq to HeapRegionManager
tschatzl
parents: 20359
diff changeset
6868 cl.verify_counts(&_old_set, &_humongous_set, &_hrm);
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents:
diff changeset
6869 }
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6870
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6871 // Optimized nmethod scanning
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6872
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6873 class RegisterNMethodOopClosure: public OopClosure {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6874 G1CollectedHeap* _g1h;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6875 nmethod* _nm;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6876
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6877 template <class T> void do_oop_work(T* p) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6878 T heap_oop = oopDesc::load_heap_oop(p);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6879 if (!oopDesc::is_null(heap_oop)) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6880 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6881 HeapRegion* hr = _g1h->heap_region_containing(obj);
13062
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6882 assert(!hr->continuesHumongous(),
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6883 err_msg("trying to add code root "PTR_FORMAT" in continuation of humongous region "HR_FORMAT
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6884 " starting at "HR_FORMAT,
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6885 _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region())));
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6886
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20481
diff changeset
6887 // HeapRegion::add_strong_code_root_locked() avoids adding duplicate entries.
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20481
diff changeset
6888 hr->add_strong_code_root_locked(_nm);
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6889 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6890 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6891
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6892 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6893 RegisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6894 _g1h(g1h), _nm(nm) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6895
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6896 void do_oop(oop* p) { do_oop_work(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6897 void do_oop(narrowOop* p) { do_oop_work(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6898 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6899
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6900 class UnregisterNMethodOopClosure: public OopClosure {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6901 G1CollectedHeap* _g1h;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6902 nmethod* _nm;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6903
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6904 template <class T> void do_oop_work(T* p) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6905 T heap_oop = oopDesc::load_heap_oop(p);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6906 if (!oopDesc::is_null(heap_oop)) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6907 oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6908 HeapRegion* hr = _g1h->heap_region_containing(obj);
13062
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6909 assert(!hr->continuesHumongous(),
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6910 err_msg("trying to remove code root "PTR_FORMAT" in continuation of humongous region "HR_FORMAT
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6911 " starting at "HR_FORMAT,
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6912 _nm, HR_FORMAT_PARAMS(hr), HR_FORMAT_PARAMS(hr->humongous_start_region())));
28674af341ac 8027756: assert(!hr->isHumongous()) failed: code root in humongous region?
tschatzl
parents: 13060
diff changeset
6913
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6914 hr->remove_strong_code_root(_nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6915 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6916 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6917
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6918 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6919 UnregisterNMethodOopClosure(G1CollectedHeap* g1h, nmethod* nm) :
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6920 _g1h(g1h), _nm(nm) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6921
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6922 void do_oop(oop* p) { do_oop_work(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6923 void do_oop(narrowOop* p) { do_oop_work(p); }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6924 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6925
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6926 void G1CollectedHeap::register_nmethod(nmethod* nm) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6927 CollectedHeap::register_nmethod(nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6928
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6929 guarantee(nm != NULL, "sanity");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6930 RegisterNMethodOopClosure reg_cl(this, nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6931 nm->oops_do(&reg_cl);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6932 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6933
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6934 void G1CollectedHeap::unregister_nmethod(nmethod* nm) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6935 CollectedHeap::unregister_nmethod(nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6936
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6937 guarantee(nm != NULL, "sanity");
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6938 UnregisterNMethodOopClosure reg_cl(this, nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6939 nm->oops_do(&reg_cl, true);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6940 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6941
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
6942 void G1CollectedHeap::purge_code_root_memory() {
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
6943 double purge_start = os::elapsedTime();
20494
7baf47cb97cb 8048268: G1 Code Root Migration performs poorly
mgerdin
parents: 20481
diff changeset
6944 G1CodeRootSet::purge();
17753
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
6945 double purge_time_ms = (os::elapsedTime() - purge_start) * 1000.0;
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
6946 g1_policy()->phase_times()->record_strong_code_root_purge_time(purge_time_ms);
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
6947 }
191174b49bec 8035406: Improve data structure for Code Cache remembered sets
tschatzl
parents: 17749
diff changeset
6948
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6949 class RebuildStrongCodeRootClosure: public CodeBlobClosure {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6950 G1CollectedHeap* _g1h;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6951
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6952 public:
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6953 RebuildStrongCodeRootClosure(G1CollectedHeap* g1h) :
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6954 _g1h(g1h) {}
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6955
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6956 void do_code_blob(CodeBlob* cb) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6957 nmethod* nm = (cb != NULL) ? cb->as_nmethod_or_null() : NULL;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6958 if (nm == NULL) {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6959 return;
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6960 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6961
20191
fd81a5764900 8046231: G1: Code root location ... from nmethod ... not in strong code roots for region
pliden
parents: 20190
diff changeset
6962 if (ScavengeRootsInCode) {
12080
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6963 _g1h->register_nmethod(nm);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6964 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6965 }
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6966 };
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6967
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6968 void G1CollectedHeap::rebuild_strong_code_roots() {
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6969 RebuildStrongCodeRootClosure blob_cl(this);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6970 CodeCache::blobs_do(&blob_cl);
5888334c9c24 7145569: G1: optimize nmethods scanning
johnc
parents: 11096
diff changeset
6971 }