tamaño - tipos de variables en java ejemplos
Calcular el tamaño del objeto en Java (4)
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 programa 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 arquitectura 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<Field> instanceFields = new LinkedList<Field>();
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() { }
}
Esta pregunta ya tiene una respuesta aquí:
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!
Mire en 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<Integer> hashset = new HashSet<Integer>();
Random random = new Random();
int n = 10000;
for (int i = 1; i <= n; i++) {
hashset.add(random.nextInt());
}
System.out.println(ObjectGraphMeasurer.measure(hashset));
}
}
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 por ejemplo:
En Java, ¿cuál es la mejor forma de determinar el tamaño de un objeto?
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.