Mercurial > hg > truffle
diff src/share/vm/runtime/aprofiler.cpp @ 6725:da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
Reviewed-by: jmasa, stefank, never, coleenp, kvn, brutisso, mgerdin, dholmes, jrose, twisti, roland
Contributed-by: jmasa <jon.masamitsu@oracle.com>, stefank <stefan.karlsson@oracle.com>, mgerdin <mikael.gerdin@oracle.com>, never <tom.rodriguez@oracle.com>
author | coleenp |
---|---|
date | Sat, 01 Sep 2012 13:25:18 -0400 |
parents | f95d63e2154a |
children | 203f64878aab |
line wrap: on
line diff
--- a/src/share/vm/runtime/aprofiler.cpp Fri Aug 31 16:39:35 2012 -0700 +++ b/src/share/vm/runtime/aprofiler.cpp Sat Sep 01 13:25:18 2012 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, 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 @@ -25,7 +25,6 @@ #include "precompiled.hpp" #include "classfile/systemDictionary.hpp" #include "gc_interface/collectedHeap.inline.hpp" -#include "memory/permGen.hpp" #include "memory/resourceArea.hpp" #include "memory/space.hpp" #include "oops/oop.inline.hpp" @@ -34,35 +33,19 @@ bool AllocationProfiler::_active = false; -GrowableArray<klassOop>* AllocationProfiler::_print_array = NULL; +GrowableArray<Klass*>* AllocationProfiler::_print_array = NULL; class AllocProfClosure : public ObjectClosure { public: void do_object(oop obj) { - Klass* k = obj->blueprint(); + Klass* k = obj->klass(); k->set_alloc_count(k->alloc_count() + 1); k->set_alloc_size(k->alloc_size() + obj->size()); } }; -#ifndef PRODUCT - -class AllocProfResetClosure : public ObjectClosure { - public: - void do_object(oop obj) { - if (obj->is_klass()) { - Klass* k = Klass::cast(klassOop(obj)); - k->set_alloc_count(0); - k->set_alloc_size(0); - } - } -}; - -#endif - - void AllocationProfiler::iterate_since_last_gc() { if (is_active()) { AllocProfClosure blk; @@ -82,20 +65,20 @@ } -void AllocationProfiler::add_class_to_array(klassOop k) { +void AllocationProfiler::add_class_to_array(Klass* k) { _print_array->append(k); } -void AllocationProfiler::add_classes_to_array(klassOop k) { +void AllocationProfiler::add_classes_to_array(Klass* k) { // Iterate over klass and all array klasses for klass - k->klass_part()->with_array_klasses_do(&AllocationProfiler::add_class_to_array); + k->with_array_klasses_do(&AllocationProfiler::add_class_to_array); } -int AllocationProfiler::compare_classes(klassOop* k1, klassOop* k2) { +int AllocationProfiler::compare_classes(Klass** k1, Klass** k2) { // Sort by total allocation size - return (*k2)->klass_part()->alloc_size() - (*k1)->klass_part()->alloc_size(); + return (*k2)->alloc_size() - (*k1)->alloc_size(); } @@ -113,14 +96,14 @@ size_t total_alloc_size = 0; int total_alloc_count = 0; for (int index = 0; index < _print_array->length(); index++) { - klassOop k = _print_array->at(index); - size_t alloc_size = k->klass_part()->alloc_size(); + Klass* k = _print_array->at(index); + size_t alloc_size = k->alloc_size(); if (alloc_size > cutoff) { - int alloc_count = k->klass_part()->alloc_count(); + int alloc_count = k->alloc_count(); #ifdef PRODUCT - const char* name = k->klass_part()->external_name(); + const char* name = k->external_name(); #else - const char* name = k->klass_part()->internal_name(); + const char* name = k->internal_name(); #endif tty->print_cr("%20u %10u %8u %s", alloc_size * BytesPerWord, @@ -130,6 +113,8 @@ total_alloc_size += alloc_size; total_alloc_count += alloc_count; } + k->set_alloc_count(0); + k->set_alloc_size(0); } tty->print_cr("%20u %10u %8u --total--", total_alloc_size * BytesPerWord, @@ -148,32 +133,11 @@ tty->cr(); // Print regular instance klasses and basic type array klasses - _print_array = new GrowableArray<klassOop>(SystemDictionary::number_of_classes()*2); + _print_array = new GrowableArray<Klass*>(SystemDictionary::number_of_classes()*2); SystemDictionary::classes_do(&add_classes_to_array); Universe::basic_type_classes_do(&add_classes_to_array); sort_and_print_array(cutoff); - #ifndef PRODUCT - tty->print_cr("Allocation profile for system classes (sizes in bytes, cutoff = %d bytes):", cutoff * BytesPerWord); - tty->cr(); - - // Print system klasses (methods, symbols, constant pools, etc.) - _print_array = new GrowableArray<klassOop>(64); - Universe::system_classes_do(&add_classes_to_array); - sort_and_print_array(cutoff); - - tty->print_cr("Permanent generation dump (sizes in bytes, cutoff = %d bytes):", cutoff * BytesPerWord); - tty->cr(); - - AllocProfResetClosure resetblk; - Universe::heap()->permanent_object_iterate(&resetblk); - AllocProfClosure blk; - Universe::heap()->permanent_object_iterate(&blk); - - _print_array = new GrowableArray<klassOop>(SystemDictionary::number_of_classes()*2); - SystemDictionary::classes_do(&add_classes_to_array); - Universe::basic_type_classes_do(&add_classes_to_array); - Universe::system_classes_do(&add_classes_to_array); - sort_and_print_array(cutoff); - #endif + // This used to print metadata in the permgen but since there isn't a permgen + // anymore, it is not yet implemented. }