diff agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java @ 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 f6f3bb0ee072
children 5a98bf7d847b
line wrap: on
line diff
--- a/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java	Fri Aug 31 16:39:35 2012 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 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
@@ -634,29 +634,57 @@
                 } else {
                     String s = t.nextToken();
                     if (s.equals("-a")) {
-                        HeapVisitor iterator = new DefaultHeapVisitor() {
-                                public boolean doObj(Oop obj) {
-                                    if (obj instanceof MethodData) {
-                                        Method m = ((MethodData)obj).getMethod();
-                                        out.println("MethodData " + obj.getHandle() + " for " +
+                        SystemDictionary sysDict = VM.getVM().getSystemDictionary();
+                        sysDict.allClassesDo(new SystemDictionary.ClassVisitor() {
+                                public void visit(Klass k) {
+                                    if (k instanceof InstanceKlass) {
+                                        MethodArray methods = ((InstanceKlass)k).getMethods();
+                                        for (int i = 0; i < methods.length(); i++) {
+                                            Method m = methods.at(i);
+                                            MethodData mdo = m.getMethodData();
+                                            if (mdo != null) {
+                                                out.println("MethodData " + mdo.getAddress() + " for " +
                                                     "method " + m.getMethodHolder().getName().asString() + "." +
                                                     m.getName().asString() +
-                                                    m.getSignature().asString() + "@" + m.getHandle());
-                                        ((MethodData)obj).printDataOn(out);
+                                                            m.getSignature().asString() + "@" + m.getAddress());
+                                                mdo.printDataOn(out);
                                     }
-                                    return false;
+                                }
+                                    }
                                 }
-                            };
-                        VM.getVM().getObjectHeap().iteratePerm(iterator);
+                            }
+                            );
                     } else {
                         Address a = VM.getVM().getDebugger().parseAddress(s);
-                        OopHandle handle = a.addOffsetToAsOopHandle(0);
-                        MethodData mdo = (MethodData)VM.getVM().getObjectHeap().newOop(handle);
+                        MethodData mdo = (MethodData) Metadata.instantiateWrapperFor(a);
                         mdo.printDataOn(out);
                     }
                 }
             }
         },
+        new Command("printall", "printall", false) {
+            // Print every MDO in the heap or the one referenced by expression.
+            public void doit(Tokens t) {
+                if (t.countTokens() != 0) {
+                    usage();
+                } else {
+                    SystemDictionary sysDict = VM.getVM().getSystemDictionary();
+                    sysDict.allClassesDo(new SystemDictionary.ClassVisitor() {
+                            public void visit(Klass k) {
+                                if (k instanceof InstanceKlass && ((InstanceKlass)k).getConstants().getCache() != null) {
+                                    MethodArray methods = ((InstanceKlass)k).getMethods();
+                                    for (int i = 0; i < methods.length(); i++) {
+                                        Method m = methods.at(i);
+                                        HTMLGenerator gen = new HTMLGenerator(false);
+                                        out.println(gen.genHTML(m));
+                                    }
+                                }
+                            }
+                        }
+                        );
+                }
+            }
+        },
         new Command("dumpideal", "dumpideal { -a | id }", false) {
             // Do a full dump of the nodes reachabile from root in each compiler thread.
             public void doit(Tokens t) {
@@ -1229,7 +1257,7 @@
                             }
                         };
                     VM.getVM().getObjectHeap().iterateRaw(iterator);
-                } else if (type.equals("heap") || type.equals("perm")) {
+                } else if (type.equals("heap")) {
                     HeapVisitor iterator = new DefaultHeapVisitor() {
                             public boolean doObj(Oop obj) {
                                 int index = 0;
@@ -1246,11 +1274,7 @@
                                 return false;
                             }
                         };
-                    if (type.equals("heap")) {
                         VM.getVM().getObjectHeap().iterate(iterator);
-                    } else {
-                        VM.getVM().getObjectHeap().iteratePerm(iterator);
-                    }
                 } else if (type.equals("codecache")) {
                     CodeCacheVisitor v = new CodeCacheVisitor() {
                             public void prologue(Address start, Address end) {