src/share/vm/memory/heapInspection.hpp

Print this page
rev 4773 : 8005849: JEP 167: Event-Based JVM Tracing
Reviewed-by: acorn, coleenp, sla
Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>

*** 24,33 **** --- 24,34 ---- #ifndef SHARE_VM_MEMORY_HEAPINSPECTION_HPP #define SHARE_VM_MEMORY_HEAPINSPECTION_HPP #include "memory/allocation.inline.hpp" + #include "memory/klassInfoClosure.hpp" #include "oops/oop.inline.hpp" #include "oops/annotations.hpp" #include "utilities/macros.hpp" #if INCLUDE_SERVICES
*** 201,216 **** 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; - }; - class KlassInfoBucket: public CHeapObj<mtInternal> { private: KlassInfoEntry* _list; KlassInfoEntry* list() { return _list; } void set_list(KlassInfoEntry* l) { _list = l; } --- 202,211 ----
*** 222,231 **** --- 217,228 ---- }; class KlassInfoTable: public StackObj { private: int _size; + static const int _num_buckets = 20011; + size_t _size_of_instances_in_words; // An aligned reference address (typically the least // address in the perm gen) used for hashing klass // objects. HeapWord* _ref;
*** 240,264 **** AllClassesFinder(KlassInfoTable* table) : _table(table) {} virtual void do_klass(Klass* k); }; public: ! // Table size ! enum { ! cit_size = 20011 ! }; ! KlassInfoTable(int size, HeapWord* ref, bool need_class_stats); ~KlassInfoTable(); bool record_instance(const oop obj); void iterate(KlassInfoClosure* cic); bool allocation_failed() { return _buckets == NULL; } friend class KlassInfoHisto; }; class KlassInfoHisto : public StackObj { private: KlassInfoTable *_cit; GrowableArray<KlassInfoEntry*>* _elements; GrowableArray<KlassInfoEntry*>* elements() const { return _elements; } const char* _title; const char* title() const { return _title; } --- 237,259 ---- 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; KlassInfoTable *_cit; GrowableArray<KlassInfoEntry*>* _elements; GrowableArray<KlassInfoEntry*>* elements() const { return _elements; } const char* _title; const char* title() const { return _title; }
*** 332,364 **** // add a leading space for separation. return w + 1; } public: ! enum { ! histo_initial_size = 1000 ! }; ! KlassInfoHisto(KlassInfoTable* cit, const char* title, ! int estimatedCount); ~KlassInfoHisto(); void add(KlassInfoEntry* cie); void print_histo_on(outputStream* st, bool print_class_stats, bool csv_format, const char *columns); void sort(); }; #endif // INCLUDE_SERVICES class HeapInspection : public StackObj { bool _csv_format; // "comma separated values" format for spreadsheet. bool _print_help; bool _print_class_stats; const char* _columns; public: HeapInspection(bool csv_format, bool print_help, bool print_class_stats, const char *columns) : _csv_format(csv_format), _print_help(print_help), _print_class_stats(print_class_stats), _columns(columns) {} ! void heap_inspection(outputStream* st, bool need_prologue) NOT_SERVICES_RETURN; static void find_instances_at_safepoint(Klass* k, GrowableArray<oop>* result) NOT_SERVICES_RETURN; }; #endif // SHARE_VM_MEMORY_HEAPINSPECTION_HPP --- 327,363 ---- // add a leading space for separation. return w + 1; } public: ! KlassInfoHisto(KlassInfoTable* cit, const char* title); ~KlassInfoHisto(); void add(KlassInfoEntry* cie); void print_histo_on(outputStream* st, bool print_class_stats, bool csv_format, const char *columns); void sort(); }; #endif // INCLUDE_SERVICES + // These declarations are needed since teh declaration of KlassInfoTable and + // KlassInfoClosure are guarded by #if INLCUDE_SERVICES + class KlassInfoTable; + class KlassInfoClosure; + class HeapInspection : public StackObj { bool _csv_format; // "comma separated values" format for spreadsheet. bool _print_help; bool _print_class_stats; const char* _columns; public: HeapInspection(bool csv_format, bool print_help, bool print_class_stats, const char *columns) : _csv_format(csv_format), _print_help(print_help), _print_class_stats(print_class_stats), _columns(columns) {} ! void heap_inspection(outputStream* st) NOT_SERVICES_RETURN; ! size_t populate_table(KlassInfoTable* cit, BoolObjectClosure* filter = NULL) NOT_SERVICES_RETURN; static void find_instances_at_safepoint(Klass* k, GrowableArray<oop>* result) NOT_SERVICES_RETURN; + private: + void iterate_over_heap(KlassInfoTable* cit, BoolObjectClosure* filter = NULL); }; #endif // SHARE_VM_MEMORY_HEAPINSPECTION_HPP