annotate src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp @ 3772:6747fd0512e0

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