annotate src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @ 2149:7e37af9d69ef

7011379: G1: overly long concurrent marking cycles Summary: This changeset introduces filtering of SATB buffers at the point when they are about to be enqueued. If this filtering clears enough entries on each buffer, the buffer can then be re-used and not enqueued. This cuts down the number of SATB buffers that need to be processed by the concurrent marking threads. Reviewed-by: johnc, ysr
author tonyp
date Wed, 19 Jan 2011 09:35:17 -0500
parents f95d63e2154a
children 9afee0b9fc1d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
diff changeset
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1387
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: 1387
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
26 #include "classfile/symbolTable.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
27 #include "classfile/systemDictionary.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
28 #include "code/codeCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
29 #include "gc_implementation/parallelScavenge/generationSizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
30 #include "gc_implementation/parallelScavenge/parallelScavengeHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
31 #include "gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
32 #include "gc_implementation/parallelScavenge/psMarkSweep.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
33 #include "gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
34 #include "gc_implementation/parallelScavenge/psOldGen.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
35 #include "gc_implementation/parallelScavenge/psPermGen.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
36 #include "gc_implementation/parallelScavenge/psScavenge.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
37 #include "gc_implementation/parallelScavenge/psYoungGen.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
38 #include "gc_implementation/shared/isGCActiveMark.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
39 #include "gc_implementation/shared/spaceDecorator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
40 #include "gc_interface/gcCause.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
41 #include "memory/gcLocker.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
42 #include "memory/referencePolicy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
43 #include "memory/referenceProcessor.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
44 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
45 #include "runtime/biasedLocking.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
46 #include "runtime/fprofiler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
47 #include "runtime/safepoint.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
48 #include "runtime/vmThread.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
49 #include "services/management.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
50 #include "services/memoryService.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
51 #include "utilities/events.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1836
diff changeset
52 #include "utilities/stack.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 elapsedTimer PSMarkSweep::_accumulated_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 unsigned int PSMarkSweep::_total_invocations = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 jlong PSMarkSweep::_time_of_last_gc = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 CollectorCounters* PSMarkSweep::_counters = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 void PSMarkSweep::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
60 MemRegion mr = Universe::heap()->reserved_region();
a61af66fc99e Initial load
duke
parents:
diff changeset
61 _ref_processor = new ReferenceProcessor(mr,
a61af66fc99e Initial load
duke
parents:
diff changeset
62 true, // atomic_discovery
a61af66fc99e Initial load
duke
parents:
diff changeset
63 false); // mt_discovery
374
a4b729f5b611 6716466: par compact - remove VerifyParallelOldWithMarkSweep code
jcoomes
parents: 263
diff changeset
64 _counters = new CollectorCounters("PSMarkSweep", 1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // This method contains all heap specific policy for invoking mark sweep.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // PSMarkSweep::invoke_no_policy() will only attempt to mark-sweep-compact
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // the heap. It will do nothing further. If we need to bail out for policy
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // reasons, scavenge before full gc, or any other specialized behavior, it
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // needs to be added here.
a61af66fc99e Initial load
duke
parents:
diff changeset
72 //
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // Note that this method should only be called from the vm_thread while
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // at a safepoint!
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
75 //
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
76 // Note that the all_soft_refs_clear flag in the collector policy
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
77 // may be true because this method can be called without intervening
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
78 // activity. For example when the heap space is tight and full measure
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
79 // are being taken to free space.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
80
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 void PSMarkSweep::invoke(bool maximum_heap_compaction) {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 assert(SafepointSynchronize::is_at_safepoint(), "should be at safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
83 assert(Thread::current() == (Thread*)VMThread::vm_thread(), "should be in vm thread");
a61af66fc99e Initial load
duke
parents:
diff changeset
84 assert(!Universe::heap()->is_gc_active(), "not reentrant");
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
87 GCCause::Cause gc_cause = heap->gc_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
88 PSAdaptiveSizePolicy* policy = heap->size_policy();
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
89 IsGCActiveMark mark;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
90
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
91 if (ScavengeBeforeFullGC) {
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
92 PSScavenge::invoke_no_policy();
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
93 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
95 const bool clear_all_soft_refs =
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
96 heap->collector_policy()->should_clear_all_soft_refs();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
97
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
98 int count = (maximum_heap_compaction)?1:MarkSweepAlwaysCompactCount;
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
99 IntFlagSetting flag_setting(MarkSweepAlwaysCompactCount, count);
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
100 PSMarkSweep::invoke_no_policy(clear_all_soft_refs || maximum_heap_compaction);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // This method contains no policy. You should probably
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // be calling invoke() instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
105 void PSMarkSweep::invoke_no_policy(bool clear_all_softrefs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 assert(SafepointSynchronize::is_at_safepoint(), "must be at a safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert(ref_processor() != NULL, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 if (GC_locker::check_active_before_gc()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
114 GCCause::Cause gc_cause = heap->gc_cause();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
116 PSAdaptiveSizePolicy* size_policy = heap->size_policy();
a61af66fc99e Initial load
duke
parents:
diff changeset
117
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
118 // The scope of casr should end after code that can change
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
119 // CollectorPolicy::_should_clear_all_soft_refs.
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
120 ClearedAllSoftRefs casr(clear_all_softrefs, heap->collector_policy());
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
121
0
a61af66fc99e Initial load
duke
parents:
diff changeset
122 PSYoungGen* young_gen = heap->young_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
123 PSOldGen* old_gen = heap->old_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
124 PSPermGen* perm_gen = heap->perm_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // Increment the invocation count
a61af66fc99e Initial load
duke
parents:
diff changeset
127 heap->increment_total_collections(true /* full */);
a61af66fc99e Initial load
duke
parents:
diff changeset
128
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
129 // Save information needed to minimize mangling
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
130 heap->record_gen_tops_before_GC();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
131
0
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // We need to track unique mark sweep invocations as well.
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _total_invocations++;
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 AdaptiveSizePolicyOutput(size_policy, heap->total_collections());
a61af66fc99e Initial load
duke
parents:
diff changeset
136
a61af66fc99e Initial load
duke
parents:
diff changeset
137 if (PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
138 Universe::print_heap_before_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Fill in TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
142 heap->accumulate_statistics_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
143 heap->ensure_parsability(true); // retire TLABs
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (VerifyBeforeGC && heap->total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 HandleMark hm; // Discard invalid handles created during verification
a61af66fc99e Initial load
duke
parents:
diff changeset
147 gclog_or_tty->print(" VerifyBeforeGC:");
a61af66fc99e Initial load
duke
parents:
diff changeset
148 Universe::verify(true);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // Verify object start arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
152 if (VerifyObjectStartArray &&
a61af66fc99e Initial load
duke
parents:
diff changeset
153 VerifyBeforeGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
154 old_gen->verify_object_start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
155 perm_gen->verify_object_start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
158 heap->pre_full_gc_dump();
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
159
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // Filled in below to track the state of the young gen after the collection.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 bool eden_empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 bool survivors_empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 bool young_gen_empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 {
a61af66fc99e Initial load
duke
parents:
diff changeset
166 HandleMark hm;
a61af66fc99e Initial load
duke
parents:
diff changeset
167 const bool is_system_gc = gc_cause == GCCause::_java_lang_system_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // This is useful for debugging but don't change the output the
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // the customer sees.
a61af66fc99e Initial load
duke
parents:
diff changeset
170 const char* gc_cause_str = "Full GC";
a61af66fc99e Initial load
duke
parents:
diff changeset
171 if (is_system_gc && PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
172 gc_cause_str = "Full GC (System)";
a61af66fc99e Initial load
duke
parents:
diff changeset
173 }
a61af66fc99e Initial load
duke
parents:
diff changeset
174 gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
a61af66fc99e Initial load
duke
parents:
diff changeset
175 TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
176 TraceTime t1(gc_cause_str, PrintGC, !PrintGCDetails, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 TraceCollectorStats tcs(counters());
a61af66fc99e Initial load
duke
parents:
diff changeset
178 TraceMemoryManagerStats tms(true /* Full GC */);
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 if (TraceGen1Time) accumulated_time()->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Let the size policy know we're starting
a61af66fc99e Initial load
duke
parents:
diff changeset
183 size_policy->major_collection_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 // When collecting the permanent generation methodOops may be moving,
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // so we either have to flush all bcp data or convert it into bci.
a61af66fc99e Initial load
duke
parents:
diff changeset
187 CodeCache::gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
188 Threads::gc_prologue();
a61af66fc99e Initial load
duke
parents:
diff changeset
189 BiasedLocking::preserve_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 // Capture heap size before collection for printing.
a61af66fc99e Initial load
duke
parents:
diff changeset
192 size_t prev_used = heap->used();
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Capture perm gen size before collection for sizing.
a61af66fc99e Initial load
duke
parents:
diff changeset
195 size_t perm_gen_prev_used = perm_gen->used_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // For PrintGCDetails
a61af66fc99e Initial load
duke
parents:
diff changeset
198 size_t old_gen_prev_used = old_gen->used_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
199 size_t young_gen_prev_used = young_gen->used_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 allocate_stacks();
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
a61af66fc99e Initial load
duke
parents:
diff changeset
204 COMPILER2_PRESENT(DerivedPointerTable::clear());
a61af66fc99e Initial load
duke
parents:
diff changeset
205
a61af66fc99e Initial load
duke
parents:
diff changeset
206 ref_processor()->enable_discovery();
457
27a80744a83b 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 453
diff changeset
207 ref_processor()->setup_policy(clear_all_softrefs);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
208
a61af66fc99e Initial load
duke
parents:
diff changeset
209 mark_sweep_phase1(clear_all_softrefs);
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 mark_sweep_phase2();
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 // Don't add any more derived pointers during phase3
a61af66fc99e Initial load
duke
parents:
diff changeset
214 COMPILER2_PRESENT(assert(DerivedPointerTable::is_active(), "Sanity"));
a61af66fc99e Initial load
duke
parents:
diff changeset
215 COMPILER2_PRESENT(DerivedPointerTable::set_active(false));
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 mark_sweep_phase3();
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 mark_sweep_phase4();
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 restore_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 deallocate_stacks();
a61af66fc99e Initial load
duke
parents:
diff changeset
224
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
225 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
226 // Do a complete mangle (top to end) because the usage for
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
227 // scratch does not maintain a top pointer.
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
228 young_gen->to_space()->mangle_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
229 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
230
0
a61af66fc99e Initial load
duke
parents:
diff changeset
231 eden_empty = young_gen->eden_space()->is_empty();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 if (!eden_empty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 eden_empty = absorb_live_data_from_eden(size_policy, young_gen, old_gen);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // Update heap occupancy information which is used as
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // input to soft ref clearing policy at the next gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
238 Universe::update_heap_info_at_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
239
a61af66fc99e Initial load
duke
parents:
diff changeset
240 survivors_empty = young_gen->from_space()->is_empty() &&
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
241 young_gen->to_space()->is_empty();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242 young_gen_empty = eden_empty && survivors_empty;
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 BarrierSet* bs = heap->barrier_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
245 if (bs->is_a(BarrierSet::ModRef)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 ModRefBarrierSet* modBS = (ModRefBarrierSet*)bs;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 MemRegion old_mr = heap->old_gen()->reserved();
a61af66fc99e Initial load
duke
parents:
diff changeset
248 MemRegion perm_mr = heap->perm_gen()->reserved();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 assert(perm_mr.end() <= old_mr.start(), "Generations out of order");
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 if (young_gen_empty) {
a61af66fc99e Initial load
duke
parents:
diff changeset
252 modBS->clear(MemRegion(perm_mr.start(), old_mr.end()));
a61af66fc99e Initial load
duke
parents:
diff changeset
253 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
254 modBS->invalidate(MemRegion(perm_mr.start(), old_mr.end()));
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 BiasedLocking::restore_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 Threads::gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
260 CodeCache::gc_epilogue();
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 COMPILER2_PRESENT(DerivedPointerTable::update_pointers());
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 ref_processor()->enqueue_discovered_references(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // Update time of last GC
a61af66fc99e Initial load
duke
parents:
diff changeset
267 reset_millis_since_last_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Let the size policy know we're done
a61af66fc99e Initial load
duke
parents:
diff changeset
270 size_policy->major_collection_end(old_gen->used_in_bytes(), gc_cause);
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (UseAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 gclog_or_tty->print("AdaptiveSizeStart: ");
a61af66fc99e Initial load
duke
parents:
diff changeset
276 gclog_or_tty->stamp();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 gclog_or_tty->print_cr(" collection: %d ",
a61af66fc99e Initial load
duke
parents:
diff changeset
278 heap->total_collections());
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 gclog_or_tty->print("old_gen_capacity: %d young_gen_capacity: %d"
a61af66fc99e Initial load
duke
parents:
diff changeset
281 " perm_gen_capacity: %d ",
a61af66fc99e Initial load
duke
parents:
diff changeset
282 old_gen->capacity_in_bytes(), young_gen->capacity_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
283 perm_gen->capacity_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Don't check if the size_policy is ready here. Let
a61af66fc99e Initial load
duke
parents:
diff changeset
288 // the size_policy check that internally.
a61af66fc99e Initial load
duke
parents:
diff changeset
289 if (UseAdaptiveGenerationSizePolicyAtMajorCollection &&
a61af66fc99e Initial load
duke
parents:
diff changeset
290 ((gc_cause != GCCause::_java_lang_system_gc) ||
a61af66fc99e Initial load
duke
parents:
diff changeset
291 UseAdaptiveSizePolicyWithSystemGC)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 // Calculate optimal free space amounts
a61af66fc99e Initial load
duke
parents:
diff changeset
293 assert(young_gen->max_size() >
a61af66fc99e Initial load
duke
parents:
diff changeset
294 young_gen->from_space()->capacity_in_bytes() +
a61af66fc99e Initial load
duke
parents:
diff changeset
295 young_gen->to_space()->capacity_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
296 "Sizes of space in young gen are out-of-bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
297 size_t max_eden_size = young_gen->max_size() -
a61af66fc99e Initial load
duke
parents:
diff changeset
298 young_gen->from_space()->capacity_in_bytes() -
a61af66fc99e Initial load
duke
parents:
diff changeset
299 young_gen->to_space()->capacity_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 size_policy->compute_generation_free_space(young_gen->used_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
301 young_gen->eden_space()->used_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
302 old_gen->used_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
303 perm_gen->used_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
304 young_gen->eden_space()->capacity_in_bytes(),
a61af66fc99e Initial load
duke
parents:
diff changeset
305 old_gen->max_gen_size(),
a61af66fc99e Initial load
duke
parents:
diff changeset
306 max_eden_size,
a61af66fc99e Initial load
duke
parents:
diff changeset
307 true /* full gc*/,
1387
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
308 gc_cause,
0bfd3fb24150 6858496: Clear all SoftReferences before an out-of-memory due to GC overhead limit.
jmasa
parents: 1311
diff changeset
309 heap->collector_policy());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 heap->resize_old_gen(size_policy->calculated_old_free_size_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 // Don't resize the young generation at an major collection. A
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // desired young generation size may have been calculated but
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // resizing the young generation complicates the code because the
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // resizing of the old generation may have moved the boundary
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // between the young generation and the old generation. Let the
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // young generation resizing happen at the minor collections.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320 if (PrintAdaptiveSizePolicy) {
a61af66fc99e Initial load
duke
parents:
diff changeset
321 gclog_or_tty->print_cr("AdaptiveSizeStop: collection: %d ",
a61af66fc99e Initial load
duke
parents:
diff changeset
322 heap->total_collections());
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
a61af66fc99e Initial load
duke
parents:
diff changeset
324 }
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 if (UsePerfData) {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 heap->gc_policy_counters()->update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
328 heap->gc_policy_counters()->update_old_capacity(
a61af66fc99e Initial load
duke
parents:
diff changeset
329 old_gen->capacity_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
330 heap->gc_policy_counters()->update_young_capacity(
a61af66fc99e Initial load
duke
parents:
diff changeset
331 young_gen->capacity_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
332 }
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 heap->resize_all_tlabs();
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // We collected the perm gen, so we'll resize it here.
a61af66fc99e Initial load
duke
parents:
diff changeset
337 perm_gen->compute_new_size(perm_gen_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
338
a61af66fc99e Initial load
duke
parents:
diff changeset
339 if (TraceGen1Time) accumulated_time()->stop();
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 if (PrintGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // Don't print a GC timestamp here. This is after the GC so
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // would be confusing.
a61af66fc99e Initial load
duke
parents:
diff changeset
345 young_gen->print_used_change(young_gen_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
346 old_gen->print_used_change(old_gen_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
347 }
a61af66fc99e Initial load
duke
parents:
diff changeset
348 heap->print_heap_change(prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 // Do perm gen after heap becase prev_used does
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // not include the perm gen (done this way in the other
a61af66fc99e Initial load
duke
parents:
diff changeset
351 // collectors).
a61af66fc99e Initial load
duke
parents:
diff changeset
352 if (PrintGCDetails) {
a61af66fc99e Initial load
duke
parents:
diff changeset
353 perm_gen->print_used_change(perm_gen_prev_used);
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // Track memory usage and detect low memory
a61af66fc99e Initial load
duke
parents:
diff changeset
358 MemoryService::track_memory_usage();
a61af66fc99e Initial load
duke
parents:
diff changeset
359 heap->update_counters();
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 if (VerifyAfterGC && heap->total_collections() >= VerifyGCStartAt) {
a61af66fc99e Initial load
duke
parents:
diff changeset
363 HandleMark hm; // Discard invalid handles created during verification
a61af66fc99e Initial load
duke
parents:
diff changeset
364 gclog_or_tty->print(" VerifyAfterGC:");
a61af66fc99e Initial load
duke
parents:
diff changeset
365 Universe::verify(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 // Re-verify object start arrays
a61af66fc99e Initial load
duke
parents:
diff changeset
369 if (VerifyObjectStartArray &&
a61af66fc99e Initial load
duke
parents:
diff changeset
370 VerifyAfterGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
371 old_gen->verify_object_start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
372 perm_gen->verify_object_start_array();
a61af66fc99e Initial load
duke
parents:
diff changeset
373 }
a61af66fc99e Initial load
duke
parents:
diff changeset
374
263
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
375 if (ZapUnusedHeapArea) {
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
376 old_gen->object_space()->check_mangled_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
377 perm_gen->object_space()->check_mangled_unused_area_complete();
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
378 }
12eea04c8b06 6672698: mangle_unused_area() should not remangle the entire heap at each collection.
jmasa
parents: 0
diff changeset
379
0
a61af66fc99e Initial load
duke
parents:
diff changeset
380 NOT_PRODUCT(ref_processor()->verify_no_references_recorded());
a61af66fc99e Initial load
duke
parents:
diff changeset
381
a61af66fc99e Initial load
duke
parents:
diff changeset
382 if (PrintHeapAtGC) {
a61af66fc99e Initial load
duke
parents:
diff changeset
383 Universe::print_heap_after_gc();
a61af66fc99e Initial load
duke
parents:
diff changeset
384 }
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 481
diff changeset
385
615
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
386 heap->post_full_gc_dump();
c6c601a0f2d6 6797870: Add -XX:+{HeapDump,PrintClassHistogram}{Before,After}FullGC
ysr
parents: 546
diff changeset
387
546
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 481
diff changeset
388 #ifdef TRACESPINNING
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 481
diff changeset
389 ParallelTaskTerminator::print_termination_counts();
05c6d52fa7a9 6690928: Use spinning in combination with yields for workstealing termination.
jmasa
parents: 481
diff changeset
390 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 bool PSMarkSweep::absorb_live_data_from_eden(PSAdaptiveSizePolicy* size_policy,
a61af66fc99e Initial load
duke
parents:
diff changeset
394 PSYoungGen* young_gen,
a61af66fc99e Initial load
duke
parents:
diff changeset
395 PSOldGen* old_gen) {
a61af66fc99e Initial load
duke
parents:
diff changeset
396 MutableSpace* const eden_space = young_gen->eden_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
397 assert(!eden_space->is_empty(), "eden must be non-empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
398 assert(young_gen->virtual_space()->alignment() ==
a61af66fc99e Initial load
duke
parents:
diff changeset
399 old_gen->virtual_space()->alignment(), "alignments do not match");
a61af66fc99e Initial load
duke
parents:
diff changeset
400
a61af66fc99e Initial load
duke
parents:
diff changeset
401 if (!(UseAdaptiveSizePolicy && UseAdaptiveGCBoundary)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
402 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // Both generations must be completely committed.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 if (young_gen->virtual_space()->uncommitted_size() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
407 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
408 }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 if (old_gen->virtual_space()->uncommitted_size() != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413 // Figure out how much to take from eden. Include the average amount promoted
a61af66fc99e Initial load
duke
parents:
diff changeset
414 // in the total; otherwise the next young gen GC will simply bail out to a
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // full GC.
a61af66fc99e Initial load
duke
parents:
diff changeset
416 const size_t alignment = old_gen->virtual_space()->alignment();
a61af66fc99e Initial load
duke
parents:
diff changeset
417 const size_t eden_used = eden_space->used_in_bytes();
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
418 const size_t promoted = (size_t)size_policy->avg_promoted()->padded_average();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
419 const size_t absorb_size = align_size_up(eden_used + promoted, alignment);
a61af66fc99e Initial load
duke
parents:
diff changeset
420 const size_t eden_capacity = eden_space->capacity_in_bytes();
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 if (absorb_size >= eden_capacity) {
a61af66fc99e Initial load
duke
parents:
diff changeset
423 return false; // Must leave some space in eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
424 }
a61af66fc99e Initial load
duke
parents:
diff changeset
425
a61af66fc99e Initial load
duke
parents:
diff changeset
426 const size_t new_young_size = young_gen->capacity_in_bytes() - absorb_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
427 if (new_young_size < young_gen->min_gen_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
428 return false; // Respect young gen minimum size.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 }
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 if (TraceAdaptiveGCBoundary && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
432 gclog_or_tty->print(" absorbing " SIZE_FORMAT "K: "
a61af66fc99e Initial load
duke
parents:
diff changeset
433 "eden " SIZE_FORMAT "K->" SIZE_FORMAT "K "
a61af66fc99e Initial load
duke
parents:
diff changeset
434 "from " SIZE_FORMAT "K, to " SIZE_FORMAT "K "
a61af66fc99e Initial load
duke
parents:
diff changeset
435 "young_gen " SIZE_FORMAT "K->" SIZE_FORMAT "K ",
a61af66fc99e Initial load
duke
parents:
diff changeset
436 absorb_size / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
437 eden_capacity / K, (eden_capacity - absorb_size) / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
438 young_gen->from_space()->used_in_bytes() / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
439 young_gen->to_space()->used_in_bytes() / K,
a61af66fc99e Initial load
duke
parents:
diff changeset
440 young_gen->capacity_in_bytes() / K, new_young_size / K);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // Fill the unused part of the old gen.
a61af66fc99e Initial load
duke
parents:
diff changeset
444 MutableSpace* const old_space = old_gen->object_space();
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
445 HeapWord* const unused_start = old_space->top();
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
446 size_t const unused_words = pointer_delta(old_space->end(), unused_start);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
447
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
448 if (unused_words > 0) {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
449 if (unused_words < CollectedHeap::min_fill_size()) {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
450 return false; // If the old gen cannot be filled, must give up.
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
451 }
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
452 CollectedHeap::fill_with_objects(unused_start, unused_words);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 }
a61af66fc99e Initial load
duke
parents:
diff changeset
454
a61af66fc99e Initial load
duke
parents:
diff changeset
455 // Take the live data from eden and set both top and end in the old gen to
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // eden top. (Need to set end because reset_after_change() mangles the region
a61af66fc99e Initial load
duke
parents:
diff changeset
457 // from end to virtual_space->high() in debug builds).
a61af66fc99e Initial load
duke
parents:
diff changeset
458 HeapWord* const new_top = eden_space->top();
a61af66fc99e Initial load
duke
parents:
diff changeset
459 old_gen->virtual_space()->expand_into(young_gen->virtual_space(),
a61af66fc99e Initial load
duke
parents:
diff changeset
460 absorb_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
461 young_gen->reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
462 old_space->set_top(new_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
463 old_space->set_end(new_top);
a61af66fc99e Initial load
duke
parents:
diff changeset
464 old_gen->reset_after_change();
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Update the object start array for the filler object and the data from eden.
a61af66fc99e Initial load
duke
parents:
diff changeset
467 ObjectStartArray* const start_array = old_gen->start_array();
481
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
468 for (HeapWord* p = unused_start; p < new_top; p += oop(p)->size()) {
7d7a7c599c17 6578152: fill_region_with_object has usability and safety issues
jcoomes
parents: 457
diff changeset
469 start_array->allocate_block(p);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472 // Could update the promoted average here, but it is not typically updated at
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // full GCs and the value to use is unclear. Something like
a61af66fc99e Initial load
duke
parents:
diff changeset
474 //
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // cur_promoted_avg + absorb_size / number_of_scavenges_since_last_full_gc.
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477 size_policy->set_bytes_absorbed_from_eden(absorb_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
478 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480
a61af66fc99e Initial load
duke
parents:
diff changeset
481 void PSMarkSweep::allocate_stacks() {
a61af66fc99e Initial load
duke
parents:
diff changeset
482 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
483 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 PSYoungGen* young_gen = heap->young_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 MutableSpace* to_space = young_gen->to_space();
a61af66fc99e Initial load
duke
parents:
diff changeset
488 _preserved_marks = (PreservedMark*)to_space->top();
a61af66fc99e Initial load
duke
parents:
diff changeset
489 _preserved_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 // We want to calculate the size in bytes first.
a61af66fc99e Initial load
duke
parents:
diff changeset
492 _preserved_count_max = pointer_delta(to_space->end(), to_space->top(), sizeof(jbyte));
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // Now divide by the size of a PreservedMark
a61af66fc99e Initial load
duke
parents:
diff changeset
494 _preserved_count_max /= sizeof(PreservedMark);
a61af66fc99e Initial load
duke
parents:
diff changeset
495 }
a61af66fc99e Initial load
duke
parents:
diff changeset
496
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 void PSMarkSweep::deallocate_stacks() {
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
499 _preserved_mark_stack.clear(true);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
500 _preserved_oop_stack.clear(true);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
501 _marking_stack.clear();
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
502 _objarray_stack.clear(true);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
503 _revisit_klass_stack.clear(true);
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
504 _revisit_mdo_stack.clear(true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
505 }
a61af66fc99e Initial load
duke
parents:
diff changeset
506
a61af66fc99e Initial load
duke
parents:
diff changeset
507 void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // Recursively traverse all live objects and mark them
a61af66fc99e Initial load
duke
parents:
diff changeset
509 EventMark m("1 mark object");
a61af66fc99e Initial load
duke
parents:
diff changeset
510 TraceTime tm("phase 1", PrintGCDetails && Verbose, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 trace(" 1");
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
514 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // General strong roots.
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
517 {
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
518 ParallelScavengeHeap::ParStrongRootsScope psrs;
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
519 Universe::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
520 ReferenceProcessor::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
521 JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
522 CodeBlobToOopClosure each_active_code_blob(mark_and_push_closure(), /*do_marking=*/ true);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
523 Threads::oops_do(mark_and_push_closure(), &each_active_code_blob);
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
524 ObjectSynchronizer::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
525 FlatProfiler::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
526 Management::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
527 JvmtiExport::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
528 SystemDictionary::always_strong_oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
529 vmSymbols::oops_do(mark_and_push_closure());
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
530 // Do not treat nmethods as strong roots for mark/sweep, since we can unload them.
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
531 //CodeCache::scavenge_root_nmethods_do(CodeBlobToOopClosure(mark_and_push_closure()));
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
532 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // Flush marking stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
535 follow_stack();
a61af66fc99e Initial load
duke
parents:
diff changeset
536
a61af66fc99e Initial load
duke
parents:
diff changeset
537 // Process reference objects found during marking
a61af66fc99e Initial load
duke
parents:
diff changeset
538 {
457
27a80744a83b 6778647: snap(), snap_policy() should be renamed setup(), setup_policy()
ysr
parents: 453
diff changeset
539 ref_processor()->setup_policy(clear_all_softrefs);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 ref_processor()->process_discovered_references(
453
c96030fff130 6684579: SoftReference processing can be made more efficient
ysr
parents: 380
diff changeset
541 is_alive_closure(), mark_and_push_closure(), follow_stack_closure(), NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
542 }
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // Follow system dictionary roots and unload classes
a61af66fc99e Initial load
duke
parents:
diff changeset
545 bool purged_class = SystemDictionary::do_unloading(is_alive_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // Follow code cache roots
a61af66fc99e Initial load
duke
parents:
diff changeset
548 CodeCache::do_unloading(is_alive_closure(), mark_and_push_closure(),
a61af66fc99e Initial load
duke
parents:
diff changeset
549 purged_class);
a61af66fc99e Initial load
duke
parents:
diff changeset
550 follow_stack(); // Flush marking stack
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552 // Update subklass/sibling/implementor links of live klasses
a61af66fc99e Initial load
duke
parents:
diff changeset
553 follow_weak_klass_links();
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
554 assert(_marking_stack.is_empty(), "just drained");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
555
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 628
diff changeset
556 // Visit memoized mdo's and clear unmarked weak refs
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 628
diff changeset
557 follow_mdo_weak_refs();
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
558 assert(_marking_stack.is_empty(), "just drained");
941
8b46c4d82093 4957990: Perm heap bloat in JVM
ysr
parents: 628
diff changeset
559
0
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // Visit symbol and interned string tables and delete unmarked oops
a61af66fc99e Initial load
duke
parents:
diff changeset
561 SymbolTable::unlink(is_alive_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
562 StringTable::unlink(is_alive_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
563
1836
894b1d7c7e01 6423256: GC stacks should use a better data structure
jcoomes
parents: 1552
diff changeset
564 assert(_marking_stack.is_empty(), "stack should be empty by now");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 void PSMarkSweep::mark_sweep_phase2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
569 EventMark m("2 compute new addresses");
a61af66fc99e Initial load
duke
parents:
diff changeset
570 TraceTime tm("phase 2", PrintGCDetails && Verbose, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
571 trace("2");
a61af66fc99e Initial load
duke
parents:
diff changeset
572
a61af66fc99e Initial load
duke
parents:
diff changeset
573 // Now all live objects are marked, compute the new object addresses.
a61af66fc99e Initial load
duke
parents:
diff changeset
574
a61af66fc99e Initial load
duke
parents:
diff changeset
575 // It is imperative that we traverse perm_gen LAST. If dead space is
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // allowed a range of dead object may get overwritten by a dead int
a61af66fc99e Initial load
duke
parents:
diff changeset
577 // array. If perm_gen is not traversed last a klassOop may get
a61af66fc99e Initial load
duke
parents:
diff changeset
578 // overwritten. This is fine since it is dead, but if the class has dead
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // instances we have to skip them, and in order to find their size we
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // need the klassOop!
a61af66fc99e Initial load
duke
parents:
diff changeset
581 //
a61af66fc99e Initial load
duke
parents:
diff changeset
582 // It is not required that we traverse spaces in the same order in
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // phase2, phase3 and phase4, but the ValidateMarkSweep live oops
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // tracking expects us to do so. See comment under phase4.
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
587 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
588
a61af66fc99e Initial load
duke
parents:
diff changeset
589 PSOldGen* old_gen = heap->old_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
590 PSPermGen* perm_gen = heap->perm_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // Begin compacting into the old gen
a61af66fc99e Initial load
duke
parents:
diff changeset
593 PSMarkSweepDecorator::set_destination_decorator_tenured();
a61af66fc99e Initial load
duke
parents:
diff changeset
594
a61af66fc99e Initial load
duke
parents:
diff changeset
595 // This will also compact the young gen spaces.
a61af66fc99e Initial load
duke
parents:
diff changeset
596 old_gen->precompact();
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // Compact the perm gen into the perm gen
a61af66fc99e Initial load
duke
parents:
diff changeset
599 PSMarkSweepDecorator::set_destination_decorator_perm_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
600
a61af66fc99e Initial load
duke
parents:
diff changeset
601 perm_gen->precompact();
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 // This should be moved to the shared markSweep code!
a61af66fc99e Initial load
duke
parents:
diff changeset
605 class PSAlwaysTrueClosure: public BoolObjectClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
606 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
607 void do_object(oop p) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 bool do_object_b(oop p) { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 };
a61af66fc99e Initial load
duke
parents:
diff changeset
610 static PSAlwaysTrueClosure always_true;
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612 void PSMarkSweep::mark_sweep_phase3() {
a61af66fc99e Initial load
duke
parents:
diff changeset
613 // Adjust the pointers to reflect the new locations
a61af66fc99e Initial load
duke
parents:
diff changeset
614 EventMark m("3 adjust pointers");
a61af66fc99e Initial load
duke
parents:
diff changeset
615 TraceTime tm("phase 3", PrintGCDetails && Verbose, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
616 trace("3");
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
619 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
620
a61af66fc99e Initial load
duke
parents:
diff changeset
621 PSYoungGen* young_gen = heap->young_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
622 PSOldGen* old_gen = heap->old_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
623 PSPermGen* perm_gen = heap->perm_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 // General strong roots.
a61af66fc99e Initial load
duke
parents:
diff changeset
626 Universe::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
627 ReferenceProcessor::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
628 JNIHandles::oops_do(adjust_root_pointer_closure()); // Global (strong) JNI handles
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
629 Threads::oops_do(adjust_root_pointer_closure(), NULL);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
630 ObjectSynchronizer::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
631 FlatProfiler::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
632 Management::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
633 JvmtiExport::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
634 // SO_AllClasses
a61af66fc99e Initial load
duke
parents:
diff changeset
635 SystemDictionary::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
636 vmSymbols::oops_do(adjust_root_pointer_closure());
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 628
diff changeset
637 //CodeCache::scavenge_root_nmethods_oops_do(adjust_root_pointer_closure());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // Now adjust pointers in remaining weak roots. (All of which should
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // have been cleared if they pointed to non-surviving objects.)
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // Global (weak) JNI handles
a61af66fc99e Initial load
duke
parents:
diff changeset
642 JNIHandles::weak_oops_do(&always_true, adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 CodeCache::oops_do(adjust_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
645 SymbolTable::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
646 StringTable::oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
647 ref_processor()->weak_oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
648 PSScavenge::reference_processor()->weak_oops_do(adjust_root_pointer_closure());
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 adjust_marks();
a61af66fc99e Initial load
duke
parents:
diff changeset
651
a61af66fc99e Initial load
duke
parents:
diff changeset
652 young_gen->adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
653 old_gen->adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
654 perm_gen->adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
656
a61af66fc99e Initial load
duke
parents:
diff changeset
657 void PSMarkSweep::mark_sweep_phase4() {
a61af66fc99e Initial load
duke
parents:
diff changeset
658 EventMark m("4 compact heap");
a61af66fc99e Initial load
duke
parents:
diff changeset
659 TraceTime tm("phase 4", PrintGCDetails && Verbose, true, gclog_or_tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
660 trace("4");
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 // All pointers are now adjusted, move objects accordingly
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // It is imperative that we traverse perm_gen first in phase4. All
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // classes must be allocated earlier than their instances, and traversing
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // perm_gen first makes sure that all klassOops have moved to their new
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // location before any instance does a dispatch through it's klass!
a61af66fc99e Initial load
duke
parents:
diff changeset
668 ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
a61af66fc99e Initial load
duke
parents:
diff changeset
669 assert(heap->kind() == CollectedHeap::ParallelScavengeHeap, "Sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
670
a61af66fc99e Initial load
duke
parents:
diff changeset
671 PSYoungGen* young_gen = heap->young_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
672 PSOldGen* old_gen = heap->old_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
673 PSPermGen* perm_gen = heap->perm_gen();
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 perm_gen->compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
676 old_gen->compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
677 young_gen->compact();
a61af66fc99e Initial load
duke
parents:
diff changeset
678 }
a61af66fc99e Initial load
duke
parents:
diff changeset
679
a61af66fc99e Initial load
duke
parents:
diff changeset
680 jlong PSMarkSweep::millis_since_last_gc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
681 jlong ret_val = os::javaTimeMillis() - _time_of_last_gc;
a61af66fc99e Initial load
duke
parents:
diff changeset
682 // XXX See note in genCollectedHeap::millis_since_last_gc().
a61af66fc99e Initial load
duke
parents:
diff changeset
683 if (ret_val < 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 NOT_PRODUCT(warning("time warp: %d", ret_val);)
a61af66fc99e Initial load
duke
parents:
diff changeset
685 return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
686 }
a61af66fc99e Initial load
duke
parents:
diff changeset
687 return ret_val;
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689
a61af66fc99e Initial load
duke
parents:
diff changeset
690 void PSMarkSweep::reset_millis_since_last_gc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
691 _time_of_last_gc = os::javaTimeMillis();
a61af66fc99e Initial load
duke
parents:
diff changeset
692 }