Calcular el tamaño del objeto en Java

Quiero registrar cuánta memoria (en bytes, con suerte) ocupa un objeto para un proyecto (estoy comparando tamaños de estructuras de datos) y parece que no hay ningún método para hacerlo en Java. Supuestamente, C / C ++ tiene el método sizeOf() , pero esto es inexistente en Java. Traté de registrar la memoria libre en la JVM con Runtime.getRuntime().freeMemory() antes y después de crear el objeto y luego registrar la diferencia, pero solo daría 0 o 131304, y nada en el medio, independientemente del número de elementos en la estructura. ¡Ayuda por favor!

Puede usar el paquete java.lang.instrumentation :

http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html

Tiene un método que se puede utilizar para obtener la aproximación específica de la implementación del tamaño del objeto, así como la sobrecarga asociada con el objeto.

La respuesta que Sergey enlazó tiene un gran ejemplo, que volveré a publicar aquí, pero ya debiste haber mirado desde su comentario:

 import java.lang.instrument.Instrumentation; public class ObjectSizeFetcher { private static Instrumentation instrumentation; public static void premain(String args, Instrumentation inst) { instrumentation = inst; } public static long getObjectSize(Object o) { return instrumentation.getObjectSize(o); } } 

Use getObjectSize:

 public class C { private int x; private int y; public static void main(String [] args) { System.out.println(ObjectSizeFetcher.getObjectSize(new C())); } } 

Fuente:

En Java, ¿cuál es la mejor forma de determinar el tamaño de un objeto?

Mire en https://github.com/DimitrisAndreou/memory-measurer. Guava lo usa internamente, y ObjectGraphMeasurer es especialmente sencillo de usar desde el primer momento, sin ningún argumento especial de línea de comandos.

 import objectexplorer.ObjectGraphMeasurer; public class Measurer { public static void main(String[] args) { Set hashset = new HashSet(); Random random = new Random(); int n = 10000; for (int i = 1; i <= n; i++) { hashset.add(random.nextInt()); } System.out.println(ObjectGraphMeasurer.measure(hashset)); } } 

La clase java.lang.instrument.Instrumentation proporciona una buena forma de obtener el tamaño de un objeto Java, pero requiere que defina un premain y ejecute su progtwig con un agente java. Esto es muy aburrido cuando no necesita ningún agente y luego debe proporcionar un agente ficticio Jar a su aplicación.

Así que obtuve una solución alternativa usando la clase Unsafe del sun.misc . Por lo tanto, teniendo en cuenta la alineación del montón de objetos de acuerdo con la architecture del procesador y el cálculo del desplazamiento de campo máximo, puede medir el tamaño de un objeto de Java. En el siguiente ejemplo, utilizo una clase auxiliar UtilUnsafe para obtener una referencia al objeto sun.misc.Unsafe .

 private static final int NR_BITS = Integer.valueOf(System.getProperty("sun.arch.data.model")); private static final int BYTE = 8; private static final int WORD = NR_BITS/BYTE; private static final int MIN_SIZE = 16; public static int sizeOf(Class src){ // // Get the instance fields of src class // List instanceFields = new LinkedList(); do{ if(src == Object.class) return MIN_SIZE; for (Field f : src.getDeclaredFields()) { if((f.getModifiers() & Modifier.STATIC) == 0){ instanceFields.add(f); } } src = src.getSuperclass(); }while(instanceFields.isEmpty()); // // Get the field with the maximum offset // long maxOffset = 0; for (Field f : instanceFields) { long offset = UtilUnsafe.UNSAFE.objectFieldOffset(f); if(offset > maxOffset) maxOffset = offset; } return (((int)maxOffset/WORD) + 1)*WORD; } class UtilUnsafe { public static final sun.misc.Unsafe UNSAFE; static { Object theUnsafe = null; Exception exception = null; try { Class uc = Class.forName("sun.misc.Unsafe"); Field f = uc.getDeclaredField("theUnsafe"); f.setAccessible(true); theUnsafe = f.get(uc); } catch (Exception e) { exception = e; } UNSAFE = (sun.misc.Unsafe) theUnsafe; if (UNSAFE == null) throw new Error("Could not obtain access to sun.misc.Unsafe", exception); } private UtilUnsafe() { } } 

Una búsqueda en Google de “tamaño de Java” dio como resultado un buen artículo sobre el tamaño de Java en javaworld. En realidad, una lectura interesante.

Para responder a su pregunta, no hay un equivalente Java de “sizeof ()”, pero el artículo describe un par de maneras en que puede obtener el tamaño de bytes de sus clases instanciadas.