[Java的] 得到的物体的尺寸 – 找对象的大小
正如我们已经知道, 得到一个基本数据类型,如int的大小, 双,… 在Java中容易, 请致电Integer.BYTE, Double.BYTE,… 完成. 但是,当你想要检索某一类对象的大小,是不容易.
有几种方法来获得一个物体的尺寸, 在这篇文章中我将告诉你如何建立自己属性的类. 说这个问题的建筑,但什么人写,, 我们只是复制并只用于, 不计利息,或影响到它在所有.
注意常见的事情是我们认为一个物体的大小等于属性包含的总规模, 但在现实中是有一点不同. 除了属性的对象的大小总大小为:
加 8 标题的字节.
它始终是一个多 8, 否则就需要四舍五入到右边是倍数 8.
这是类尺寸计算对象.
package cachhoc.net.sizeobject; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashSet; import java.util.Set; public class ObjectSizeCalculator { private static final int REFERENCE_SIZE; private static final int HEADER_SIZE; private static final int LONG_SIZE = 8; private static final int INT_SIZE = 4; private static final int BYTE_SIZE = 1; private static final int BOOLEAN_SIZE = 1; private static final int CHAR_SIZE = 2; private static final int SHORT_SIZE = 2; private static final int FLOAT_SIZE = 4; private static final int DOUBLE_SIZE = 8; private static final int ALIGNMENT = 8; static { try { if (System.getProperties().get("java.vm.name").toString() .contains("64")) { // java.vm.name is something like // "Java HotSpot(TM) 64-Bit Server VM" REFERENCE_SIZE = 8; HEADER_SIZE = 16; } else { REFERENCE_SIZE = 4; HEADER_SIZE = 8; } } catch (Exception ex) { ex.printStackTrace(); throw new AssertionError(ex); } } public static long sizeOf(Object o) throws IllegalAccessException { return sizeOf(o, new HashSet()); } private static long sizeOf(Object o, Set visited) throws IllegalAccessException { if (o == null) { return 0; } ObjectWrapper objectWrapper = new ObjectWrapper(o); if (visited.contains(objectWrapper)) { // We have reference graph with cycles. return 0; } visited.add(objectWrapper); long size = HEADER_SIZE; Class clazz = o.getClass(); if (clazz.isArray()) { if (clazz == long[].class) { long[] objs = (long[]) o; size += objs.length * LONG_SIZE; } else if (clazz == int[].class) { int[] objs = (int[]) o; size += objs.length * INT_SIZE; } else if (clazz == byte[].class) { byte[] objs = (byte[]) o; size += objs.length * BYTE_SIZE; } else if (clazz == boolean[].class) { boolean[] objs = (boolean[]) o; size += objs.length * BOOLEAN_SIZE; } else if (clazz == char[].class) { char[] objs = (char[]) o; size += objs.length * CHAR_SIZE; } else if (clazz == short[].class) { short[] objs = (short[]) o; size += objs.length * SHORT_SIZE; } else if (clazz == float[].class) { float[] objs = (float[]) o; size += objs.length * FLOAT_SIZE; } else if (clazz == double[].class) { double[] objs = (double[]) o; size += objs.length * DOUBLE_SIZE; } else { Object[] objs = (Object[]) o; for (int i = 0; i < objs.length; i++) { size += sizeOf(objs[i], visited) + REFERENCE_SIZE; } } size += INT_SIZE; } else { Field[] fields = o.getClass().getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if (Modifier.isStatic(fields[i].getModifiers())) { continue; } fields[i].setAccessible(true); String fieldType = fields[i].getGenericType().toString(); if (fieldType.equals("long")) { size += LONG_SIZE; } else if (fieldType.equals("int")) { size += INT_SIZE; } else if (fieldType.equals("byte")) { size += BYTE_SIZE; } else if (fieldType.equals("boolean")) { size += BOOLEAN_SIZE; } else if (fieldType.equals("char")) { size += CHAR_SIZE; } else if (fieldType.equals("short")) { size += SHORT_SIZE; } else if (fieldType.equals("float")) { size += FLOAT_SIZE; } else if (fieldType.equals("double")) { size += DOUBLE_SIZE; } else { size += sizeOf(fields[i].get(o), visited) + REFERENCE_SIZE; } } } if ((size % ALIGNMENT) != 0) { size = ALIGNMENT * (size / ALIGNMENT) + ALIGNMENT; } return size; } private static final class ObjectWrapper { private Object object; public ObjectWrapper(Object object) { this.object = object; } public boolean equals(Object obj) { if (obj == this) { return true; } if ((obj == null) || (obj.getClass() != ObjectWrapper.class)) { return false; } return object == ((ObjectWrapper) obj).object; } public int hashCode() { int hash = 3; hash = 47 * hash + System.identityHashCode(object); return hash; } } }
我们运行检查大小一些对象:
package cachhoc.net.sizeobject; import java.util.HashMap; public class SizeObject { // 8 byte header int x; // 4 byte double y; // 8 byte String s; // 0 byte vì s đang null public static void main(String[] args) { SizeObject so1 = new SizeObject(); SizeObject so2 = new SizeObject(); SizeObject so3 = new SizeObject(); so2.s = "nguyenvanquan"; so3.s = "nguyenvanquan7826"; try { System.out.println("size of int Object = " + ObjectSizeCalculator.sizeOf(new Integer(5))); System.out.println("size of array int[3] = " + ObjectSizeCalculator.sizeOf(new int[] { 1, 2, 3 })); System.out.println("size of HashMap = " + ObjectSizeCalculator.sizeOf(new HashMap(512))); System.out.println("size of String\"nguyenvanquan7826\" = " + ObjectSizeCalculator.sizeOf(new String( "nguyenvanquan7826"))); System.out.println("size of Object so1 = " + ObjectSizeCalculator.sizeOf(so1)); System.out.println("size of Object so2 = " + ObjectSizeCalculator.sizeOf(so2)); System.out.println("size of Object so3 = " + ObjectSizeCalculator.sizeOf(so3)); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
其结果将是:
size of int Object = 16 size of array int[3] = 24 size of HashMap = 32 size of String"nguyenvanquan7826" = 64 size of Object so1 = 24 size of Object so2 = 80 size of Object so3 = 88
参考文章: kyryloholodnov.wordpress.com
最新评论