src/share/vm/memory/heapInspection.hpp

Print this page

        

*** 186,214 **** KlassInfoEntry* _next; Klass* _klass; long _instance_count; size_t _instance_words; long _index; public: KlassInfoEntry(Klass* k, KlassInfoEntry* next) : ! _klass(k), _instance_count(0), _instance_words(0), _next(next), _index(-1) {} KlassInfoEntry* next() const { return _next; } bool is_equal(const Klass* k) { return k == _klass; } Klass* klass() const { return _klass; } long count() const { return _instance_count; } void set_count(long ct) { _instance_count = ct; } size_t words() const { return _instance_words; } void set_words(size_t wds) { _instance_words = wds; } void set_index(long index) { _index = index; } long index() const { return _index; } int compare(KlassInfoEntry* e1, KlassInfoEntry* e2); void print_on(outputStream* st) const; const char* name() const; }; class KlassInfoClosure : public StackObj { public: // Called for each KlassInfoEntry. virtual void do_cinfo(KlassInfoEntry* cie) = 0; }; --- 186,235 ---- KlassInfoEntry* _next; Klass* _klass; long _instance_count; size_t _instance_words; long _index; + long _super_index; + GrowableArray<KlassInfoEntry*>* _subclasses; public: KlassInfoEntry(Klass* k, KlassInfoEntry* next) : ! _klass(k), _instance_count(0), _instance_words(0), _next(next), _index(-1), ! _super_index(-1), _subclasses(NULL) {} + ~KlassInfoEntry(); KlassInfoEntry* next() const { return _next; } bool is_equal(const Klass* k) { return k == _klass; } Klass* klass() const { return _klass; } long count() const { return _instance_count; } void set_count(long ct) { _instance_count = ct; } size_t words() const { return _instance_words; } void set_words(size_t wds) { _instance_words = wds; } void set_index(long index) { _index = index; } long index() const { return _index; } + void set_super_index(long index) { _super_index = index; } + long super_index() const { return _super_index; } + GrowableArray<KlassInfoEntry*>* subclasses() const { return _subclasses; } + void add_subclass(KlassInfoEntry* cie); int compare(KlassInfoEntry* e1, KlassInfoEntry* e2); void print_on(outputStream* st) const; const char* name() const; }; + inline void KlassInfoEntry::add_subclass(KlassInfoEntry* cie) { + if (_subclasses == NULL) { + _subclasses = new (ResourceObj::C_HEAP, mtInternal) GrowableArray<KlassInfoEntry*>(4, true); + } + _subclasses->append(cie); + } + + inline KlassInfoEntry::~KlassInfoEntry() { + if (_subclasses != NULL) { + delete _subclasses; + } + } + class KlassInfoClosure : public StackObj { public: // Called for each KlassInfoEntry. virtual void do_cinfo(KlassInfoEntry* cie) = 0; };
*** 246,263 **** AllClassesFinder(KlassInfoTable* table) : _table(table) {} virtual void do_klass(Klass* k); }; public: ! KlassInfoTable(bool need_class_stats); ~KlassInfoTable(); bool record_instance(const oop obj); void iterate(KlassInfoClosure* cic); bool allocation_failed() { return _buckets == NULL; } size_t size_of_instances_in_words() const; friend class KlassInfoHisto; }; class KlassInfoHisto : public StackObj { private: static const int _histo_initial_size = 1000; --- 267,296 ---- AllClassesFinder(KlassInfoTable* table) : _table(table) {} virtual void do_klass(Klass* k); }; public: ! KlassInfoTable(bool add_all_classes); ~KlassInfoTable(); bool record_instance(const oop obj); void iterate(KlassInfoClosure* cic); bool allocation_failed() { return _buckets == NULL; } size_t size_of_instances_in_words() const; friend class KlassInfoHisto; + friend class KlassHierarchy; + }; + + class KlassHierarchy : public StackObj { + public: + KlassHierarchy(KlassInfoTable* cit, const char* title); + ~KlassHierarchy(); + static void print_class_hierarchy(outputStream* st); + + private: + static void print_class(outputStream* st, KlassInfoEntry* cie, + Stack <KlassInfoEntry*, mtClass> *super_stack); }; class KlassInfoHisto : public StackObj { private: static const int _histo_initial_size = 1000;