static Map unsafe_sizeOf_cache = weakHashMap(); static long unsafe_sizeOf(O o) { if (isArray(o)) if (o cast O[]) ret inMemorySizeOfObjectArray(o.length); else ret inMemorySizeOfPrimitiveArray(o); Class c = _getClass(o); Int l = unsafe_sizeOf_cache.get(c); if (l == null) unsafe_sizeOf_cache.put(c, l = unsafe_sizeOf_uncached(c)); ret l; } static int unsafe_sizeOf_uncached(Class src) { int WORD = javaDataModelWordSize(); int MIN_SIZE = 16; new L instanceFields; while (src != null && src != O.class && empty(instanceFields)) { for (Field f : src.getDeclaredFields()) if ((f.getModifiers() & Modifier.STATIC) == 0) instanceFields.add(f); src = src.getSuperclass(); } long maxOffset = MIN_SIZE-1; for (Field f : instanceFields) { long offset = unsafe_objectFieldOffset(f); if (offset > maxOffset) maxOffset = offset; } ret (((int) maxOffset/WORD) + 1)*WORD; }