hotspot/src/share/vm/memory/heapInspection.hpp
changeset 1 489c9b5090e2
child 184 a2da5efb871c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/src/share/vm/memory/heapInspection.hpp	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2002-2006 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ */
+
+#ifndef SERVICES_KERNEL
+
+
+// HeapInspection
+
+// KlassInfoTable is a bucket hash table that
+// maps klassOops to extra information:
+//    instance count and instance word size.
+//
+// A KlassInfoBucket is the head of a link list
+// of KlassInfoEntry's
+//
+// KlassInfoHisto is a growable array of pointers
+// to KlassInfoEntry's and is used to sort
+// the entries.
+
+class KlassInfoEntry: public CHeapObj {
+ private:
+  KlassInfoEntry* _next;
+  klassOop        _klass;
+  long            _instance_count;
+  size_t          _instance_words;
+
+ public:
+  KlassInfoEntry(klassOop k, KlassInfoEntry* next) :
+    _klass(k), _instance_count(0), _instance_words(0), _next(next)
+  {}
+  KlassInfoEntry* next()     { return _next; }
+  bool is_equal(klassOop k)  { return k == _klass; }
+  klassOop klass()           { return _klass; }
+  long count()               { return _instance_count; }
+  void set_count(long ct)    { _instance_count = ct; }
+  size_t words()             { return _instance_words; }
+  void set_words(size_t wds) { _instance_words = wds; }
+  int compare(KlassInfoEntry* e1, KlassInfoEntry* e2);
+  void print_on(outputStream* st) const;
+};
+
+class KlassInfoClosure: public StackObj {
+ public:
+  // Called for each KlassInfoEntry.
+  virtual void do_cinfo(KlassInfoEntry* cie) = 0;
+};
+
+class KlassInfoBucket: public CHeapObj {
+ private:
+  KlassInfoEntry* _list;
+  KlassInfoEntry* list()           { return _list; }
+  void set_list(KlassInfoEntry* l) { _list = l; }
+ public:
+  KlassInfoEntry* lookup(const klassOop k);
+  void initialize() { _list = NULL; }
+  void empty();
+  void iterate(KlassInfoClosure* cic);
+};
+
+class KlassInfoTable: public StackObj {
+ private:
+  int _size;
+
+  // An aligned reference address (typically the least
+  // address in the perm gen) used for hashing klass
+  // objects.
+  HeapWord* _ref;
+
+  KlassInfoBucket* _buckets;
+  uint hash(klassOop p);
+  KlassInfoEntry* lookup(const klassOop k);
+
+ public:
+  // Table size
+  enum {
+    cit_size = 20011
+  };
+  KlassInfoTable(int size, HeapWord* ref);
+  ~KlassInfoTable();
+  void record_instance(const oop obj);
+  void iterate(KlassInfoClosure* cic);
+};
+
+class KlassInfoHisto : public StackObj {
+ private:
+  GrowableArray<KlassInfoEntry*>* _elements;
+  GrowableArray<KlassInfoEntry*>* elements() const { return _elements; }
+  const char* _title;
+  const char* title() const { return _title; }
+  static int sort_helper(KlassInfoEntry** e1, KlassInfoEntry** e2);
+  void print_elements(outputStream* st) const;
+ public:
+  enum {
+    histo_initial_size = 1000
+  };
+  KlassInfoHisto(const char* title,
+             int estimatedCount);
+  ~KlassInfoHisto();
+  void add(KlassInfoEntry* cie);
+  void print_on(outputStream* st) const;
+  void sort();
+};
+
+#endif // SERVICES_KERNEL
+
+class HeapInspection : public AllStatic {
+ public:
+  static void heap_inspection(outputStream* st) KERNEL_RETURN;
+  static void find_instances_at_safepoint(klassOop k, GrowableArray<oop>* result) KERNEL_RETURN;
+};