< prev index next >

src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderDataGraph.java

Print this page




  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.classfile;
  26 
  27 import java.io.PrintStream;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;

  30 import sun.jvm.hotspot.runtime.*;
  31 import sun.jvm.hotspot.oops.*;
  32 import sun.jvm.hotspot.types.*;
  33 
  34 public class ClassLoaderDataGraph {
  35   static {
  36     VM.registerVMInitializedObserver(new Observer() {
  37         public void update(Observable o, Object data) {
  38           initialize(VM.getVM().getTypeDataBase());
  39         }
  40       });
  41   }
  42 
  43   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
  44     Type type = db.lookupType("ClassLoaderDataGraph");
  45 
  46     headField = type.getAddressField("_head");
  47   }
  48 
  49   private static AddressField headField;
  50 
  51   public ClassLoaderData getClassLoaderGraphHead() {
  52     return ClassLoaderData.instantiateWrapperFor(headField.getValue());
  53   }
  54 
  55   public static interface KlassVisitor {
  56     public void visit(Klass k);









  57   }
  58 
  59   /** Iterate over all anonymous class loaders and the klasses in those */
  60   public void allAnonymousKlassesDo(final KlassVisitor v) {
  61     for (ClassLoaderData cl = getClassLoaderGraphHead();
  62          cl != null;
  63          cl = cl.next()) {
  64       if (cl.getIsAnonymous() == true) {
  65         for (Klass k = cl.getKlasses(); k != null; k = k.getNextLinkKlass()) {
  66           v.visit(k);
  67         }





  68       }






  69     }
  70   }
  71 







  72 }


  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  *
  23  */
  24 
  25 package sun.jvm.hotspot.classfile;
  26 
  27 import java.io.PrintStream;
  28 import java.util.*;
  29 import sun.jvm.hotspot.debugger.*;
  30 import sun.jvm.hotspot.classfile.*;
  31 import sun.jvm.hotspot.runtime.*;
  32 import sun.jvm.hotspot.oops.*;
  33 import sun.jvm.hotspot.types.*;
  34 
  35 public class ClassLoaderDataGraph {
  36   static {
  37     VM.registerVMInitializedObserver(new Observer() {
  38         public void update(Observable o, Object data) {
  39           initialize(VM.getVM().getTypeDataBase());
  40         }
  41       });
  42   }
  43 
  44   private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
  45     Type type = db.lookupType("ClassLoaderDataGraph");
  46 
  47     headField = type.getAddressField("_head");
  48   }
  49 
  50   private static AddressField headField;
  51 
  52   public ClassLoaderData getClassLoaderGraphHead() {
  53     return ClassLoaderData.instantiateWrapperFor(headField.getValue());
  54   }
  55 
  56   /** Lookup an already loaded class in any class loader. */
  57   public Klass find(String className) {
  58     Symbol sym = VM.getVM().getSymbolTable().probe(className);
  59     if (sym == null) return null;
  60     for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) {
  61         Klass k = cld.find(sym);
  62         if (k != null) {
  63             return k;
  64         }
  65     }
  66     return null;
  67   }
  68 
  69   /** Interface for iterating through all classes. */
  70   public static interface ClassVisitor {
  71     public void visit(Klass k);





  72   }
  73 
  74   /** Interface for iterating through all classes and their class
  75       loaders in dictionary */
  76   public static interface ClassAndLoaderVisitor {
  77     public void visit(Klass k, Oop loader);
  78   }
  79 
  80   /** Iterate over all klasses - including object, primitive
  81       array klasses */
  82   public void classesDo(ClassVisitor v) {
  83     for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) {
  84         cld.classesDo(v);
  85     }
  86   }
  87 
  88   /** Iterate over all klasses - including object, primitive
  89       array klasses, pass initiating loader. */
  90   public void allEntriesDo(ClassAndLoaderVisitor v) {
  91     for (ClassLoaderData cld = getClassLoaderGraphHead(); cld != null; cld = cld.next()) {
  92         cld.allEntriesDo(v);
  93     }
  94   }
  95 }
< prev index next >