/* * Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. *
*/
// These counters are for java.lang.management API support. // They are created even if -XX:-UsePerfData is set and in // that case, they will be allocated on C heap.
_classes_loaded_count =
PerfDataManager::create_counter(JAVA_CLS, "loadedClasses",
PerfData::U_Events, CHECK);
bool ClassLoadingService::set_verbose(bool verbose) {
MutexLocker m(Management_lock); // verbose will be set to the previous value
LogLevelType level = verbose ? LogLevel::Info : LogLevel::Off;
LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, load));
reset_trace_class_unloading(); return verbose;
}
// Caller to this function must own Management_lock void ClassLoadingService::reset_trace_class_unloading() {
assert(Management_lock->owned_by_self(), "Must own the Management_lock"); bool value = MemoryService::get_verbose() || ClassLoadingService::get_verbose();
LogLevelType level = value ? LogLevel::Info : LogLevel::Off;
LogConfiguration::configure_stdout(level, false, LOG_TAGS(class, unload));
}
static size_t compute_class_size(InstanceKlass* k) { // lifted from ClassStatistics.do_class(Klass* k)
size_t class_size = k->size(); if (k->is_instance_klass()) {
class_size += k->methods()->size(); // FIXME: Need to count the contents of methods
class_size += k->constants()->size();
class_size += k->local_interfaces()->size(); if (k->transitive_interfaces() != NULL) {
class_size += k->transitive_interfaces()->size();
} // We do not have to count implementors, since we only store one! // FIXME: How should these be accounted for, now when they have moved. //class_size += k->fields()->size();
} return class_size * oopSize;
}
if (UsePerfData) {
PerfCounter* classbytes_counter = (shared_class ? _shared_classbytes_loaded
: _classbytes_loaded); // add the class size
size_t size = compute_class_size(k);
classbytes_counter->inc(size);
}
}
void ClassLoadingService::notify_class_unloaded(InstanceKlass* k) {
DTRACE_CLASSLOAD_PROBE(unloaded, k, false); // Classes that can be unloaded must be non-shared
_classes_unloaded_count->inc();
if (UsePerfData) { // add the class size
size_t size = compute_class_size(k);
_classbytes_unloaded->inc(size);
// Compute method size & subtract from running total. // We are called during phase 1 of mark sweep, so it's // still ok to iterate through Method*s here.
Array<Method*>* methods = k->methods(); for (int i = 0; i < methods->length(); i++) {
_class_methods_size->inc(-methods->at(i)->size());
}
}
}
#endif// INCLUDE_MANAGEMENT
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.