/** * Determine the JvmInformation for the current JVM. */ private static JvmInformation getJvmInformation() { JvmInformation jif = null; jif = detectHotSpot(); if (jif == null) { jif = detectOpenJDK(); } if (jif == null) { jif = detectJRockit(); } if (jif == null) { jif = detectIBM(); } if (jif == null && is64Bit()) { // unknown 64-bit JVMs jif = UNKNOWN_64_BIT; } else if (jif == null) { // unknown 32-bit JVMs jif = UNKNOWN_32_BIT; } return jif; }
@Override public long sizeOf(Object obj) { return Math.max(CURRENT_JVM_INFORMATION.getMinimumObjectSize(), AgentLoader.agentSizeOf(obj) + CURRENT_JVM_INFORMATION.getAgentSizeOfAdjustment()); } }
int scale = UNSAFE.arrayIndexScale(klazz); long size = base + (scale * Array.getLength(obj)); size += CURRENT_JVM_INFORMATION.getFieldOffsetAdjustment(); if ((size % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { size += CURRENT_JVM_INFORMATION.getObjectAlignment() - (size % CURRENT_JVM_INFORMATION.getObjectAlignment()); return Math.max(CURRENT_JVM_INFORMATION.getMinimumObjectSize(), size); } else { for (Class<?> klazz = obj.getClass(); klazz != null; klazz = klazz.getSuperclass()) { lastFieldOffset += CURRENT_JVM_INFORMATION.getFieldOffsetAdjustment(); lastFieldOffset += 1; if ((lastFieldOffset % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { lastFieldOffset += CURRENT_JVM_INFORMATION.getObjectAlignment() - (lastFieldOffset % CURRENT_JVM_INFORMATION.getObjectAlignment()); return Math.max(CURRENT_JVM_INFORMATION.getMinimumObjectSize(), lastFieldOffset); long size = CURRENT_JVM_INFORMATION.getObjectHeaderSize(); if ((size % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { size += CURRENT_JVM_INFORMATION.getObjectAlignment() - (size % CURRENT_JVM_INFORMATION.getObjectAlignment()); return Math.max(CURRENT_JVM_INFORMATION.getMinimumObjectSize(), size);
/** * The size of an object header in bytes. */ public int getObjectHeaderSize() { return getPointerSize() + getJavaPointerSize(); }
/** * Builds a new SizeOf that will filter fields * @param fieldFilter The filter to apply * @param caching Whether to cache reflected fields * @see SizeOfFilter */ public ReflectionSizeOf(SizeOfFilter fieldFilter, boolean caching) { super(fieldFilter, caching); if (!CURRENT_JVM_INFORMATION.supportsReflectionSizeOf()) { LOGGER.warn("ReflectionSizeOf is not always accurate on the JVM (" + CURRENT_JVM_INFORMATION.getJvmDescription() + "). Please consider enabling AgentSizeOf."); } }
return guessArraySize(obj); } else { long size = CURRENT_JVM_INFORMATION.getObjectHeaderSize(); if ((doubles + words + shorts + bytes + oops) > 0 && (size % CURRENT_JVM_INFORMATION.getPointerSize()) != 0) { size += CURRENT_JVM_INFORMATION.getPointerSize() - (size % CURRENT_JVM_INFORMATION.getPointerSize()); if ((size % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { size += CURRENT_JVM_INFORMATION.getObjectAlignment() - (size % CURRENT_JVM_INFORMATION.getObjectAlignment()); return Math.max(size, CURRENT_JVM_INFORMATION.getMinimumObjectSize());
/** * Builds a new SizeOf that will filter fields according to the provided filter * * @param filter The filter to apply * @param caching whether to cache reflected fields * @throws UnsupportedOperationException If Unsafe isn't accessible * @see SizeOfFilter */ public UnsafeSizeOf(SizeOfFilter filter, boolean caching) throws UnsupportedOperationException { super(filter, caching); if (UNSAFE == null) { throw new UnsupportedOperationException("sun.misc.Unsafe instance not accessible"); } if (!CURRENT_JVM_INFORMATION.supportsUnsafeSizeOf()) { LOGGER.warn("UnsafeSizeOf is not always accurate on the JVM (" + CURRENT_JVM_INFORMATION.getJvmDescription() + "). Please consider enabling AgentSizeOf."); } }
private long guessArraySize(Object obj) { long size = PrimitiveType.getArraySize(); int length = Array.getLength(obj); if (length != 0) { Class<?> arrayElementClazz = obj.getClass().getComponentType(); if (arrayElementClazz.isPrimitive()) { size += length * PrimitiveType.forType(arrayElementClazz).getSize(); } else { size += length * PrimitiveType.getReferenceSize(); } } if ((size % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { size += CURRENT_JVM_INFORMATION.getObjectAlignment() - (size % CURRENT_JVM_INFORMATION.getObjectAlignment()); } return Math.max(size, CURRENT_JVM_INFORMATION.getMinimumObjectSize()); } }
/** * The size of a pointer * @return size in bytes */ public static int getReferenceSize() { return CURRENT_JVM_INFORMATION.getJavaPointerSize(); }
private static boolean isJRockit64GBCompression() { if (getJRockitVmArgs().contains("-XXcompressedRefs:enable=false")) { return false; } if (getJRockitVmArgs().contains("-XXcompressedRefs:size=4GB") || getJRockitVmArgs().contains("-XXcompressedRefs:size=32GB")) { return false; } if (getJRockitVmArgs().contains("-XXcompressedRefs:size=64GB")) { return true; } if (Runtime.getRuntime().maxMemory() > TWENTY_FIVE_GB && Runtime.getRuntime().maxMemory() <= FIFTY_SEVEN_GB && getJRockitVmArgs().contains("-XXcompressedRefs:enable=true")) { return true; } return false; }
private static boolean isHotspotCompressedOops() { String value = getHotSpotVmOptionValue("UseCompressedOops"); if (value == null) { return false; } else { return Boolean.valueOf(value); } }
/** * The size of the jvm-specific field offset adjustment in bytes. */ public int getFieldOffsetAdjustment() { return parent.getFieldOffsetAdjustment(); }
/** * The size of the jvm-specific agent result adjustment in bytes. */ public int getAgentSizeOfAdjustment() { return parent.getAgentSizeOfAdjustment(); }
return guessArraySize(obj); } else { long size = CURRENT_JVM_INFORMATION.getObjectHeaderSize(); if ((doubles + words + shorts + bytes + oops) > 0 && (size % CURRENT_JVM_INFORMATION.getPointerSize()) != 0) { size += CURRENT_JVM_INFORMATION.getPointerSize() - (size % CURRENT_JVM_INFORMATION.getPointerSize()); if ((size % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { size += CURRENT_JVM_INFORMATION.getObjectAlignment() - (size % CURRENT_JVM_INFORMATION.getObjectAlignment()); return Math.max(size, CURRENT_JVM_INFORMATION.getMinimumObjectSize());
/** * The size of an object header in bytes. */ public int getObjectHeaderSize() { return getPointerSize() + getJavaPointerSize(); }
/** * Builds a new SizeOf that will filter fields * @param fieldFilter The filter to apply * @param caching Whether to cache reflected fields * @see SizeOfFilter */ public ReflectionSizeOf(SizeOfFilter fieldFilter, boolean caching) { super(fieldFilter, caching); if (!CURRENT_JVM_INFORMATION.supportsReflectionSizeOf()) { LOGGER.warn("ReflectionSizeOf is not always accurate on the JVM (" + CURRENT_JVM_INFORMATION.getJvmDescription() + "). Please consider enabling AgentSizeOf."); } }
/** * Builds a new SizeOf that will filter fields according to the provided filter * * @param filter The filter to apply * @param caching whether to cache reflected fields * @throws UnsupportedOperationException If Unsafe isn't accessible * @see SizeOfFilter */ public UnsafeSizeOf(SizeOfFilter filter, boolean caching) throws UnsupportedOperationException { super(filter, caching); if (UNSAFE == null) { throw new UnsupportedOperationException("sun.misc.Unsafe instance not accessible"); } if (!CURRENT_JVM_INFORMATION.supportsUnsafeSizeOf()) { LOGGER.warn("UnsafeSizeOf is not always accurate on the JVM (" + CURRENT_JVM_INFORMATION.getJvmDescription() + "). Please consider enabling AgentSizeOf."); } }
private long guessArraySize(Object obj) { long size = PrimitiveType.getArraySize(); int length = Array.getLength(obj); if (length != 0) { Class<?> arrayElementClazz = obj.getClass().getComponentType(); if (arrayElementClazz.isPrimitive()) { size += length * PrimitiveType.forType(arrayElementClazz).getSize(); } else { size += length * PrimitiveType.getReferenceSize(); } } if ((size % CURRENT_JVM_INFORMATION.getObjectAlignment()) != 0) { size += CURRENT_JVM_INFORMATION.getObjectAlignment() - (size % CURRENT_JVM_INFORMATION.getObjectAlignment()); } return Math.max(size, CURRENT_JVM_INFORMATION.getMinimumObjectSize()); } }
/** * Size of a java pointer in bytes on this runtime (that differs when compressedOops are being used) */ public int getJavaPointerSize() { return parent.getJavaPointerSize(); }
private static boolean isJRockit4GBCompression() { if (getJRockitVmArgs().contains("-XXcompressedRefs:enable=false")) { return false; } if (getJRockitVmArgs().contains("-XXcompressedRefs:size=64GB") || getJRockitVmArgs().contains("-XXcompressedRefs:size=32GB")) { return false; } if (getJRockitVmArgs().contains("-XXcompressedRefs:size=4GB")) { return true; } if (Runtime.getRuntime().maxMemory() <= THREE_GB) { return true; } return false; }