memTrackWorker.cpp revision 4186
0N/A * Copyright (c) 2012, 2013, 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 0N/A // create thread uses cgc thread type for now. We should revisit 0N/A // the option, or create new thread type. // initial generation circuit buffer assert(
false,
"use nothrow version");
* Native memory tracking worker thread loop: * 1. merge one generation of memory recorders to staging area * 2. promote staging data to memory snapshot * This thread can run through safepoint. // take a recorder from earliest generation in buffer // merge the recorder into staging area // no more recorder to merge, promote staging area // done with this generation, increment _head pointer // promote this generation data to snapshot // failed to promote, means out of memory // check if more data arrived // transits to final shutdown // at synchronization point, where 'safepoint visible' Java threads are blocked // at a safepoint, and the rest of threads are blocked on ThreadCritical lock. // The caller MemTracker::sync() already takes ThreadCritical before calling this // Following tasks are performed: // 1. add all recorders in pending queue to current generation // 2. increase generation "pending queue has infinite loop");
// check shutdown state inside ThreadCritical // append the recorders to the end of the generation "after add to current generation has infinite loop");
// we have collected all recorders for this generation. If there is data, // we need to increment _tail to start a new generation.