diff agent/src/share/classes/sun/jvm/hotspot/oops/Array.java @ 113:ba764ed4b6f2

6420645: Create a vm that uses compressed oops for up to 32gb heapsizes Summary: Compressed oops in instances, arrays, and headers. Code contributors are coleenp, phh, never, swamyv Reviewed-by: jmasa, kamg, acorn, tbell, kvn, rasbold
author coleenp
date Sun, 13 Apr 2008 17:43:42 -0400
parents a61af66fc99e
children d1605aabd0a1
line wrap: on
line diff
--- a/agent/src/share/classes/sun/jvm/hotspot/oops/Array.java	Fri Apr 11 09:56:35 2008 -0400
+++ b/agent/src/share/classes/sun/jvm/hotspot/oops/Array.java	Sun Apr 13 17:43:42 2008 -0400
@@ -47,18 +47,52 @@
 
   private static void initialize(TypeDataBase db) throws WrongTypeException {
     Type type   = db.lookupType("arrayOopDesc");
-    length      = new CIntField(type.getCIntegerField("_length"), 0);
-    headerSize  = type.getSize();
+    typeSize    = (int)type.getSize();
   }
 
   // Size of the arrayOopDesc
-  private static long headerSize;
+  private static long headerSize=0;
+  private static long lengthOffsetInBytes=0;
+  private static long typeSize;
+
+  private static long headerSizeInBytes() {
+    if (headerSize != 0) {
+      return headerSize;
+    }
+    if (VM.getVM().isCompressedOopsEnabled()) {
+      headerSize = typeSize;
+    } else {
+      headerSize = VM.getVM().alignUp(typeSize + VM.getVM().getIntSize(),
+                                      VM.getVM().getHeapWordSize());
+    }
+    return headerSize;
+  }
 
-  // Fields
-  private static CIntField length;
+  private static long headerSize(BasicType type) {
+    if (Universe.elementTypeShouldBeAligned(type)) {
+       return alignObjectSize(headerSizeInBytes())/VM.getVM().getHeapWordSize();
+    } else {
+      return headerSizeInBytes()/VM.getVM().getHeapWordSize();
+    }
+  }
+
+  private long lengthOffsetInBytes() {
+    if (lengthOffsetInBytes != 0) {
+      return lengthOffsetInBytes;
+    }
+    if (VM.getVM().isCompressedOopsEnabled()) {
+      lengthOffsetInBytes = typeSize - VM.getVM().getIntSize();
+    } else {
+      lengthOffsetInBytes = typeSize;
+    }
+    return lengthOffsetInBytes;
+  }
 
   // Accessors for declared fields
-  public long getLength() { return length.getValue(this); }
+  public long getLength() {
+    boolean isUnsigned = true;
+    return this.getHandle().getCIntegerAt(lengthOffsetInBytes(), VM.getVM().getIntSize(), isUnsigned);
+  }
 
   public long getObjectSize() {
     ArrayKlass klass = (ArrayKlass) getKlass();
@@ -72,20 +106,12 @@
   }
 
   public static long baseOffsetInBytes(BasicType type) {
-    if (Universe.elementTypeShouldBeAligned(type)) {
-      return (VM.getVM().isLP64()) ?  alignObjectSize(headerSize)
-                                   : VM.getVM().alignUp(headerSize, 8);
-    } else {
-      return headerSize;
-    }
+    return headerSize(type) * VM.getVM().getHeapWordSize();
   }
 
   public boolean isArray()             { return true; }
 
   public void iterateFields(OopVisitor visitor, boolean doVMFields) {
     super.iterateFields(visitor, doVMFields);
-    if (doVMFields) {
-      visitor.doCInt(length, true);
-    }
   }
 }