Package io.debezium.util
Class ObjectSizeCalculator
- java.lang.Object
-
- io.debezium.util.ObjectSizeCalculator
-
public class ObjectSizeCalculator extends Object
Contains utility methods for calculating the memory usage of objects. It only works on the HotSpot JVM, and infers the actual memory layout (32 bit vs. 64 bit word size, compressed object pointers vs. uncompressed) from best available indicators. It can reliably detect a 32 bit vs. 64 bit JVM. It can only make an educated guess at whether compressed OOPs are used, though; specifically, it knows what the JVM's default choice of OOP compression would be based on HotSpot version and maximum heap sizes, but if the choice is explicitly overridden with the -XX:{+|-}UseCompressedOops command line switch, it can not detect this fact and will report incorrect sizes, as it will presume the default JVM behavior.- Author:
- Attila Szegedi
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static class
ObjectSizeCalculator.ArrayElementsVisitor
private class
ObjectSizeCalculator.ClassSizeInfo
private static class
ObjectSizeCalculator.CurrentLayout
static interface
ObjectSizeCalculator.MemoryLayoutSpecification
Describes constant memory overheads for various constructs in a JVM implementation.
-
Field Summary
Fields Modifier and Type Field Description private Set<Object>
alreadyVisited
private int
arrayHeaderSize
private com.google.common.cache.LoadingCache<Class<?>,ObjectSizeCalculator.ClassSizeInfo>
classSizeInfos
private int
objectHeaderSize
private int
objectPadding
private Deque<Object>
pending
private int
referenceSize
private long
size
private int
superclassFieldPadding
-
Constructor Summary
Constructors Constructor Description ObjectSizeCalculator(ObjectSizeCalculator.MemoryLayoutSpecification memoryLayoutSpecification)
Creates an object size calculator that can calculate object sizes for a givenmemoryLayoutSpecification
.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description long
calculateObjectSize(Object obj)
Given an object, returns the total allocated size, in bytes, of the object and all other objects reachable from it.(package private) void
enqueue(Object obj)
(package private) static ObjectSizeCalculator.MemoryLayoutSpecification
getEffectiveMemoryLayoutSpecification()
static long
getObjectSize(Object obj)
Given an object, returns the total allocated size, in bytes, of the object and all other objects reachable from it.private static long
getPrimitiveFieldSize(Class<?> type)
private void
increaseByArraySize(int length, long elementSize)
(package private) void
increaseSize(long objectSize)
(package private) static long
roundTo(long x, int multiple)
private void
visit(Object obj)
private void
visitArray(Object array)
-
-
-
Field Detail
-
arrayHeaderSize
private final int arrayHeaderSize
-
objectHeaderSize
private final int objectHeaderSize
-
objectPadding
private final int objectPadding
-
referenceSize
private final int referenceSize
-
superclassFieldPadding
private final int superclassFieldPadding
-
classSizeInfos
private final com.google.common.cache.LoadingCache<Class<?>,ObjectSizeCalculator.ClassSizeInfo> classSizeInfos
-
size
private long size
-
-
Constructor Detail
-
ObjectSizeCalculator
public ObjectSizeCalculator(ObjectSizeCalculator.MemoryLayoutSpecification memoryLayoutSpecification)
Creates an object size calculator that can calculate object sizes for a givenmemoryLayoutSpecification
.- Parameters:
memoryLayoutSpecification
- a description of the JVM memory layout.
-
-
Method Detail
-
getObjectSize
public static long getObjectSize(Object obj) throws UnsupportedOperationException
Given an object, returns the total allocated size, in bytes, of the object and all other objects reachable from it. Attempts to to detect the current JVM memory layout, but may fail withUnsupportedOperationException
;- Parameters:
obj
- the object; can be null. Passing in aClass
object doesn't do anything special, it measures the size of all objects reachable through it (which will include its class loader, and by extension, all other Class objects loaded by the same loader, and all the parent class loaders). It doesn't provide the size of the static fields in the JVM class that the Class object represents.- Returns:
- the total allocated size of the object and all other objects it retains.
- Throws:
UnsupportedOperationException
- if the current vm memory layout cannot be detected.
-
calculateObjectSize
public long calculateObjectSize(Object obj)
Given an object, returns the total allocated size, in bytes, of the object and all other objects reachable from it.- Parameters:
obj
- the object; can be null. Passing in aClass
object doesn't do anything special, it measures the size of all objects reachable through it (which will include its class loader, and by extension, all other Class objects loaded by the same loader, and all the parent class loaders). It doesn't provide the size of the static fields in the JVM class that the Class object represents.- Returns:
- the total allocated size of the object and all other objects it retains.
-
visit
private void visit(Object obj)
-
visitArray
private void visitArray(Object array)
-
increaseByArraySize
private void increaseByArraySize(int length, long elementSize)
-
enqueue
void enqueue(Object obj)
-
increaseSize
void increaseSize(long objectSize)
-
roundTo
static long roundTo(long x, int multiple)
-
getPrimitiveFieldSize
private static long getPrimitiveFieldSize(Class<?> type)
-
getEffectiveMemoryLayoutSpecification
static ObjectSizeCalculator.MemoryLayoutSpecification getEffectiveMemoryLayoutSpecification()
-
-