Class RamUsageEstimator
- java.lang.Object
-
- com.carrotsearch.randomizedtesting.rules.RamUsageEstimator
-
final class RamUsageEstimator extends java.lang.Object
Estimates the size (memory representation) of Java objects.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
RamUsageEstimator.ClassCache
Cached information about a given class.private static class
RamUsageEstimator.DummyOneFieldObject
private static class
RamUsageEstimator.DummyTwoLongObject
static class
RamUsageEstimator.JvmFeature
JVM diagnostic features.
-
Field Summary
Fields Modifier and Type Field Description static java.lang.String
JVM_INFO_STRING
JVM info string for debugging and reports.static int
NUM_BYTES_ARRAY_HEADER
Number of bytes to represent an array header (no content, but with alignments).static int
NUM_BYTES_BOOLEAN
static int
NUM_BYTES_BYTE
static int
NUM_BYTES_CHAR
static int
NUM_BYTES_DOUBLE
static int
NUM_BYTES_FLOAT
static int
NUM_BYTES_INT
static int
NUM_BYTES_LONG
static int
NUM_BYTES_OBJECT_ALIGNMENT
A constant specifying the object alignment boundary inside the JVM.static int
NUM_BYTES_OBJECT_HEADER
Number of bytes to represent an object header (no fields, no alignments).static int
NUM_BYTES_OBJECT_REF
Number of bytes this jvm uses to represent an object reference.static int
NUM_BYTES_SHORT
private static java.lang.reflect.Method
objectFieldOffsetMethod
A handle tosun.misc.Unsafe#fieldOffset(Field)
.static long
ONE_GB
One gigabyte bytes.static long
ONE_KB
One kilobyte bytes.static long
ONE_MB
One megabyte bytes.private static java.util.Map<java.lang.Class<?>,java.lang.Integer>
primitiveSizes
Sizes of primitive classes.private static java.util.EnumSet<RamUsageEstimator.JvmFeature>
supportedFeatures
All the supported "internal" JVM features detected at clinit.private static java.lang.Object
theUnsafe
A handle tosun.misc.Unsafe
.
-
Constructor Summary
Constructors Modifier Constructor Description private
RamUsageEstimator()
No instantiation.
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description private static long
adjustForField(long sizeSoFar, java.lang.reflect.Field f)
This method returns the maximum representation size of an object.static long
alignObjectSize(long size)
Aligns an object size to be the next multiple ofNUM_BYTES_OBJECT_ALIGNMENT
.private static RamUsageEstimator.ClassCache
createCacheEntry(java.lang.Class<?> clazz)
Create a cached information about shallow size and reference fields for a given class.static java.util.EnumSet<RamUsageEstimator.JvmFeature>
getSupportedFeatures()
Return the set of supported JVM features that improve the estimation.static java.util.EnumSet<RamUsageEstimator.JvmFeature>
getUnsupportedFeatures()
Return the set of unsupported JVM features that improve the estimation.static java.lang.String
humanReadableUnits(long bytes)
Returnssize
in human-readable units (GB, MB, KB or bytes).static java.lang.String
humanReadableUnits(long bytes, java.text.DecimalFormat df)
Returnssize
in human-readable units (GB, MB, KB or bytes).static java.lang.String
humanSizeOf(java.lang.Object object)
Return a human-readable size of a given object.static boolean
isSupportedJVM()
Returns true, if the current JVM is fully supported byRamUsageEstimator
.private static long
measureSizeOf(java.util.ArrayList<java.lang.Object> stack)
Non-recursive version of object descend.static long
shallowSizeOf(java.lang.Object obj)
Estimates a "shallow" memory usage of the given object.static long
shallowSizeOfAll(java.lang.Iterable<java.lang.Object> objects)
Same asshallowSizeOf(Object)
but sums up all the arguments.static long
shallowSizeOfAll(java.lang.Object... objects)
Same asshallowSizeOf(Object)
but sums up all the arguments.private static long
shallowSizeOfArray(java.lang.Object array)
Return shallow size of anyarray
.static long
shallowSizeOfInstance(java.lang.Class<?> clazz)
Returns the shallow instance size in bytes an instance of the given class would occupy.static long
sizeOf(boolean[] arr)
Returns the size in bytes of the boolean[] object.static long
sizeOf(byte[] arr)
Returns the size in bytes of the byte[] object.static long
sizeOf(char[] arr)
Returns the size in bytes of the char[] object.static long
sizeOf(double[] arr)
Returns the size in bytes of the double[] object.static long
sizeOf(float[] arr)
Returns the size in bytes of the float[] object.static long
sizeOf(int[] arr)
Returns the size in bytes of the int[] object.static long
sizeOf(long[] arr)
Returns the size in bytes of the long[] object.static long
sizeOf(short[] arr)
Returns the size in bytes of the short[] object.static long
sizeOf(java.lang.Object obj)
Estimates the RAM usage by the given object.static long
sizeOfAll(java.lang.Iterable<java.lang.Object> objects)
Same assizeOf(Object)
but sums up all the arguments.static long
sizeOfAll(java.lang.Object... objects)
Same assizeOf(Object)
but sums up all the arguments.
-
-
-
Field Detail
-
JVM_INFO_STRING
public static final java.lang.String JVM_INFO_STRING
JVM info string for debugging and reports.
-
ONE_KB
public static final long ONE_KB
One kilobyte bytes.- See Also:
- Constant Field Values
-
ONE_MB
public static final long ONE_MB
One megabyte bytes.- See Also:
- Constant Field Values
-
ONE_GB
public static final long ONE_GB
One gigabyte bytes.- See Also:
- Constant Field Values
-
NUM_BYTES_BOOLEAN
public static final int NUM_BYTES_BOOLEAN
- See Also:
- Constant Field Values
-
NUM_BYTES_BYTE
public static final int NUM_BYTES_BYTE
- See Also:
- Constant Field Values
-
NUM_BYTES_CHAR
public static final int NUM_BYTES_CHAR
- See Also:
- Constant Field Values
-
NUM_BYTES_SHORT
public static final int NUM_BYTES_SHORT
- See Also:
- Constant Field Values
-
NUM_BYTES_INT
public static final int NUM_BYTES_INT
- See Also:
- Constant Field Values
-
NUM_BYTES_FLOAT
public static final int NUM_BYTES_FLOAT
- See Also:
- Constant Field Values
-
NUM_BYTES_LONG
public static final int NUM_BYTES_LONG
- See Also:
- Constant Field Values
-
NUM_BYTES_DOUBLE
public static final int NUM_BYTES_DOUBLE
- See Also:
- Constant Field Values
-
NUM_BYTES_OBJECT_REF
public static final int NUM_BYTES_OBJECT_REF
Number of bytes this jvm uses to represent an object reference.
-
NUM_BYTES_OBJECT_HEADER
public static final int NUM_BYTES_OBJECT_HEADER
Number of bytes to represent an object header (no fields, no alignments).
-
NUM_BYTES_ARRAY_HEADER
public static final int NUM_BYTES_ARRAY_HEADER
Number of bytes to represent an array header (no content, but with alignments).
-
NUM_BYTES_OBJECT_ALIGNMENT
public static final int NUM_BYTES_OBJECT_ALIGNMENT
A constant specifying the object alignment boundary inside the JVM. Objects will always take a full multiple of this constant, possibly wasting some space.
-
primitiveSizes
private static final java.util.Map<java.lang.Class<?>,java.lang.Integer> primitiveSizes
Sizes of primitive classes.
-
theUnsafe
private static final java.lang.Object theUnsafe
A handle tosun.misc.Unsafe
.
-
objectFieldOffsetMethod
private static final java.lang.reflect.Method objectFieldOffsetMethod
A handle tosun.misc.Unsafe#fieldOffset(Field)
.
-
supportedFeatures
private static final java.util.EnumSet<RamUsageEstimator.JvmFeature> supportedFeatures
All the supported "internal" JVM features detected at clinit.
-
-
Method Detail
-
isSupportedJVM
public static boolean isSupportedJVM()
Returns true, if the current JVM is fully supported byRamUsageEstimator
. If this method returnsfalse
you are maybe using a 3rd party Java VM that is not supporting Oracle/Sun private APIs. The memory estimates can be imprecise then (no way of detecting compressed references, alignments, etc.). Lucene still tries to use sensible defaults.
-
alignObjectSize
public static long alignObjectSize(long size)
Aligns an object size to be the next multiple ofNUM_BYTES_OBJECT_ALIGNMENT
.
-
sizeOf
public static long sizeOf(byte[] arr)
Returns the size in bytes of the byte[] object.
-
sizeOf
public static long sizeOf(boolean[] arr)
Returns the size in bytes of the boolean[] object.
-
sizeOf
public static long sizeOf(char[] arr)
Returns the size in bytes of the char[] object.
-
sizeOf
public static long sizeOf(short[] arr)
Returns the size in bytes of the short[] object.
-
sizeOf
public static long sizeOf(int[] arr)
Returns the size in bytes of the int[] object.
-
sizeOf
public static long sizeOf(float[] arr)
Returns the size in bytes of the float[] object.
-
sizeOf
public static long sizeOf(long[] arr)
Returns the size in bytes of the long[] object.
-
sizeOf
public static long sizeOf(double[] arr)
Returns the size in bytes of the double[] object.
-
sizeOf
public static long sizeOf(java.lang.Object obj)
Estimates the RAM usage by the given object. It will walk the object tree and sum up all referenced objects.Resource Usage: This method internally uses a set of every object seen during traversals so it does allocate memory (it isn't side-effect free). After the method exits, this memory should be GCed.
-
sizeOfAll
public static long sizeOfAll(java.lang.Object... objects)
Same assizeOf(Object)
but sums up all the arguments. Not an overload to prevent accidental parameter conflicts withsizeOf(Object)
.
-
sizeOfAll
public static long sizeOfAll(java.lang.Iterable<java.lang.Object> objects)
Same assizeOf(Object)
but sums up all the arguments. Not an overload to prevent accidental parameter conflicts withsizeOf(Object)
.
-
shallowSizeOf
public static long shallowSizeOf(java.lang.Object obj)
Estimates a "shallow" memory usage of the given object. For arrays, this will be the memory taken by array storage (no subreferences will be followed). For objects, this will be the memory taken by the fields. JVM object alignments are also applied.
-
shallowSizeOfAll
public static long shallowSizeOfAll(java.lang.Object... objects)
Same asshallowSizeOf(Object)
but sums up all the arguments. Not an overload to prevent accidental parameter conflicts withshallowSizeOf(Object)
.
-
shallowSizeOfAll
public static long shallowSizeOfAll(java.lang.Iterable<java.lang.Object> objects)
Same asshallowSizeOf(Object)
but sums up all the arguments. Duplicate objects are not resolved and will be counted twice. Not an overload to prevent accidental parameter conflicts withshallowSizeOf(Object)
.
-
shallowSizeOfInstance
public static long shallowSizeOfInstance(java.lang.Class<?> clazz)
Returns the shallow instance size in bytes an instance of the given class would occupy. This works with all conventional classes and primitive types, but not with arrays (the size then depends on the number of elements and varies from object to object).- Throws:
java.lang.IllegalArgumentException
- ifclazz
is an array class.- See Also:
shallowSizeOf(Object)
-
getUnsupportedFeatures
public static java.util.EnumSet<RamUsageEstimator.JvmFeature> getUnsupportedFeatures()
Return the set of unsupported JVM features that improve the estimation.
-
getSupportedFeatures
public static java.util.EnumSet<RamUsageEstimator.JvmFeature> getSupportedFeatures()
Return the set of supported JVM features that improve the estimation.
-
shallowSizeOfArray
private static long shallowSizeOfArray(java.lang.Object array)
Return shallow size of anyarray
.
-
measureSizeOf
private static long measureSizeOf(java.util.ArrayList<java.lang.Object> stack)
Non-recursive version of object descend. This consumes more memory than recursive in-depth traversal but prevents stack overflows on long chains of objects or complex graphs (a max. recursion depth on my machine was ~5000 objects linked in a chain so not too much).- Parameters:
stack
- Root objects.
-
createCacheEntry
private static RamUsageEstimator.ClassCache createCacheEntry(java.lang.Class<?> clazz)
Create a cached information about shallow size and reference fields for a given class.
-
adjustForField
private static long adjustForField(long sizeSoFar, java.lang.reflect.Field f)
This method returns the maximum representation size of an object.sizeSoFar
is the object's size measured so far.f
is the field being probed.The returned offset will be the maximum of whatever was measured so far and
f
field's offset and representation size (unaligned).
-
humanReadableUnits
public static java.lang.String humanReadableUnits(long bytes)
Returnssize
in human-readable units (GB, MB, KB or bytes).
-
humanReadableUnits
public static java.lang.String humanReadableUnits(long bytes, java.text.DecimalFormat df)
Returnssize
in human-readable units (GB, MB, KB or bytes).
-
humanSizeOf
public static java.lang.String humanSizeOf(java.lang.Object object)
Return a human-readable size of a given object.- See Also:
sizeOf(Object)
,humanReadableUnits(long)
-
-