2010-11-06 9 views
5

¿Cómo podemos averiguar el tamaño de un objeto java?sizeof java object

Ejemplo:

class Person{ 
    String name; 
    int age; 

    public Person(String n, int a){ 
     name = n; 
     age = a; 
    } 
} 

Person person = new Person("Andy", 30); 

ahora ¿cómo puedo saber el tamaño de la persona objeto ??

Gracias

+3

¿Por qué necesita saber el tamaño del objeto? –

+2

Si realmente necesita saber ... http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

+0

Consideremos el escenario en el que tenemos memoria limitada y la aplicación tiene varios objetos ocupando espacio, cómo identificaríamos qué objeto toma más espacio y lo manejaremos en consecuencia. – daydreamer

Respuesta

9

La pregunta no es significativa, al menos no sin contexto adicional.

La noción de "tamaño" en Java sólo es razonablemente bien definido para las primitivas: Un byte es 8 bits (como era de esperar) un int es de 32 bits, una de 64 bits long, etc. (véase, por ejemplo http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html para una lista completa).

Para instancias de objeto, que es más complicado, porque:

  • instancias de objetos pueden (y por lo general serán) contener referencias a otras instancias internamente, por lo que debe decidir si se contará estos casos dependientes, y cómo. ¿Qué sucede si varias instancias comparten una dependencia?
  • A veces, las instancias de objeto pueden reutilizarse (por ejemplo, internamiento de java.lang.String, ver http://en.wikipedia.org/wiki/String_interning). Entonces, si usa x objetos de tamaño y, el tamaño total puede ser menor que x * y
  • La JVM tiene mucha libertad de acción sobre cómo implementar objetos e instancias internamente. Puede utilizar diferentes técnicas para diferentes instancias (por ejemplo, compartir estructuras de datos internas), por lo que puede que ni siquiera haya un "tamaño" significativo para asignar a un solo objeto.

Quizás podría explicar por qué está interesado en el tamaño de los objetos.

Existen algunas reglas generales para estimar la memoria de pila utilizada por las instancias (por ejemplo, en Sun JVM, una instancia de java.lang.Object utiliza 8 bytes), pero esto dependerá de la JVM que utilice.

Generalmente, si desea conocer el uso de su pila, utilice un generador de perfiles de memoria/montón.

Editar:

Bueno, no es (a partir de JDK 6) una forma de obtener una aproximación de la cantidad de memoria utilizada por un objeto: http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29

Todavía es sólo una aproximación ..

-3

Java tiene ningún construido en sizeof operador.

Puede probar y usar un método de serialización, serializando un objeto en la memoria y obteniendo el tamaño de esos datos, pero ese no sería necesariamente el tamaño que desea.

También podría tener un método llamado sizeOf(), así:

// returns the size of this object in bytes 
int sizeOf() 
{ 
    int size = 0; 
    size += name.Length * 2; // each character in name is 2 bytes, no? 
    size += 4; // for n, which is 32 bits = 4 bytes 
} 

Tenga en cuenta que esta aplicación no incluye los metadatos dentro de nombre, sólo el número de bytes necesarios para hacer que el char[] por ello.

+0

Pero esto tampoco mostraría la cantidad de encabezados espaciales o más. – thejh

+0

Editado, agregué esa información ... honestamente, no creo que Java haya tenido la intención de tener una función como esa ... –

+0

Creo que la serialización no es la forma precisa de hacerlo, ya que agrega metadatos con objetos para que el proceso de deserialización sepa cómo reconstruir el objeto – daydreamer

2

creo que se puede conseguir algo que podría ayudarle si haces algo como esto:

/* First trigger classloading */ 
    MyObject delegate = new MyObject(); 

    Runtime.getRuntime().gc(); 

    long before = Runtime.getRuntime().freeMemory(); 
    MyObject delegate2 = new MyObject(); 
    long after = Runtime.getRuntime().freeMemory(); 

    System.out.println("Memory used:"+(before-after)); 

Este Esperamos que pueda dar la respuesta que desea, o al menos una aproximación.

+0

¿Qué pasa con las situaciones de subprocesos múltiples? Si se asignan dos objetos del mismo tamaño al mismo tiempo, entonces el valor de la memoria utilizada será el doble del tamaño deseado. –

+0

Haría una pequeña prueba controlada de los objetos que quiero medir.Si haces esto en un entorno enhebrado, entonces todas las apuestas estarán desactivadas. – Knubo

0

Objetos. Para determinar el uso de memoria de un objeto, agregamos la cantidad de la memoria utilizada por cada variable de instancia a la sobrecarga asociada con cada objeto, típicamente 16 bytes. La sobrecarga incluye una referencia a la clase del objeto, información de recolección de basura y información de sincronización. Además, el uso de memoria es típicamente acolchado para que sea un múltiplo de 8 bytes (palabras de máquina, en una máquina de de 64 bits). Por ejemplo, un objeto Integer utiliza 24 bytes (16 bytes de overhead, 4 bytes para su variable de instancia int, y 4 bytes de relleno)

Referencia: http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X

1

Usted puede usar la biblioteca sizeof4j para calcular el tamaño de cualquier objeto en java como SizeOf.shallowSize(new Integer(2))