diff agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.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 c18cbe5936b8
children 8e47bac5643a
line wrap: on
line diff
--- a/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java	Fri Aug 31 16:39:35 2012 -0700
+++ b/agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java	Sat Sep 01 13:25:18 2012 -0400
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -27,6 +27,8 @@
 import java.util.*;
 import sun.jvm.hotspot.debugger.*;
 import sun.jvm.hotspot.memory.*;
+import sun.jvm.hotspot.oops.Metadata;
+import sun.jvm.hotspot.oops.Klass;
 import sun.jvm.hotspot.runtime.*;
 import sun.jvm.hotspot.types.*;
 
@@ -38,7 +40,7 @@
     states than the ObjectHeap code. */
 
 public class RobustOopDeterminator {
-  private static OopField klassField;
+  private static AddressField klassField;
 
   static {
     VM.registerVMInitializedObserver(new Observer() {
@@ -51,10 +53,11 @@
   private static void initialize(TypeDataBase db) {
     Type type = db.lookupType("oopDesc");
 
-    if (VM.getVM().isCompressedOopsEnabled()) {
-      klassField = type.getNarrowOopField("_metadata._compressed_klass");
+    if (VM.getVM().isCompressedHeadersEnabled()) {
+      // klassField = type.getNarrowOopField("_metadata._compressed_klass");
+      throw new InternalError("unimplemented");
     } else {
-      klassField = type.getOopField("_metadata._klass");
+      klassField = type.getAddressField("_metadata._klass");
     }
   }
 
@@ -66,18 +69,10 @@
       return false;
     }
     try {
-      for (int i = 0; i < 4; ++i) {
-        OopHandle next = klassField.getValue(oop);
-        if (next == null) {
-          return false;
-        }
-        if (next.equals(oop)) {
+      // Try to instantiate the Klass
+      Metadata.instantiateWrapperFor(klassField.getValue(oop));
           return true;
         }
-        oop = next;
-      }
-      return false;
-    }
     catch (AddressException e) {
       return false;
     }