genMarkSweep.cpp revision 2032
0N/A * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 0N/A * published by the Free Software Foundation. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 0N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA // hook up weak ref data so it can be used during Mark-Sweep // When collecting the permanent generation methodOops may be moving, // so we either have to flush all bcp data or convert it into bci. // Increment the invocation count for the permanent generation, since it is // implicitly collected whenever we do a full mark sweep collection. // Capture heap size before collection for printing. // Some of the card table updates below assume that the perm gen is "All generations are being collected, ergo perm gen too.");
// Capture used regions for each generation that will be // subject to collection, so that card table adjustments can // be made intelligently (see clear / invalidate further below). // Don't add any more derived pointers during phase3 "should be the same size");
// Set saved marks for allocation profiler (and other things? -- dld) // (Should this be in general part?) // If compaction completely evacuated all generations younger than this // one, then we can clear the card table. Otherwise, we must invalidate // it (consider all cards dirty). In the future, we might consider doing // compaction within generations only, and doing card-table sliding. // Clear/invalidate below make use of the "prev_used_regions" saved earlier. // We've evacuated all generations below us. // Invalidate the cards corresponding to the currently used // region and clear those corresponding to the evacuated region // of all generations just collected (i.e. level and younger). // refs processing: clean slate // Update heap occupancy information which is used as // input to soft ref clearing policy at the next gc. // Update time of last gc for all generations we collected // (which curently is all the generations in the heap). // Scratch request on behalf of oldest generation; will do no // $$$ To cut a corner, we'll only use the first scratch block, and then // Recursively traverse all live objects and mark them // Because follow_root_closure is created statically, cannot // use OopsInGenClosure constructor which takes a generation, // as the Universe has not been created when the static constructors false,
// Younger gens are not roots. true,
// activate StrongRootsScope true,
// Collecting permanent generation. true,
// walk code active on stacks // Process reference objects found during marking // Follow system dictionary roots and unload classes // Follow code cache roots // Visit memoized MDO's and clear any unmarked weak refs // Visit symbol and interned string tables and delete unmarked oops // Now all live objects are marked, compute the new object addresses. // It is imperative that we traverse perm_gen LAST. If dead space is // allowed a range of dead object may get overwritten by a dead int // array. If perm_gen is not traversed last a klassOop may get // overwritten. This is fine since it is dead, but if the class has dead // instances we have to skip them, and in order to find their size we // It is not required that we traverse spaces in the same order in // phase2, phase3 and phase4, but the ValidateMarkSweep live oops // tracking expects us to do so. See comment under phase4. // Adjust the pointers to reflect the new locations // Needs to be done before the system dictionary is adjusted. // Because the two closures below are created statically, cannot // use OopsInGenClosure constructor which takes a generation, // as the Universe has not been created when the static constructors false,
// Younger gens are not roots. true,
// activate StrongRootsScope true,
// Collecting permanent generation. false,
// do not walk code // Now adjust pointers in remaining weak roots. (All of which should // have been cleared if they pointed to non-surviving objects.) // All pointers are now adjusted, move objects accordingly // It is imperative that we traverse perm_gen first in phase4. All // classes must be allocated earlier than their instances, and traversing // perm_gen first makes sure that all klassOops have moved to their new // location before any instance does a dispatch through it's klass! // The ValidateMarkSweep live oops tracking expects us to traverse spaces // in the same order in phase2, phase3 and phase4. We don't quite do that // here (perm_gen first rather than last), so we tell the validate code // to use a higher index (saved from phase2) when verifying perm_gen.