Mercurial > hg > truffle
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); - } } }