Java - 如何获取对象大小
2014-09-04 16:42
495 查看
有没有一种简单的方法获取特定对象的大小?
于是发现了这么个东西:
光看了下该方法的声明,这不就是获取对象的大小么,于是没想太多,心想这下问题变得简单了,弄了个premain方法初始化Instrumentation:
export jar并在MANIFEST.MF中加上:
随便写一个实体类,用来测试:
好了,在运行参数中加上-javaagent,执行看看会输出什么:
结果....
为什么person的属性比person还大? 等等,name和life的大小好像也有问题....
回去翻教科书发现事情并不是我希望的那样,我需要把对象里面的元素的大小全部加起来才能达到我要的效果....
看来还需要亲自解决一些事情,于是:
这段代码并不完整,还有很多因素并没有考虑进去,大体思路差不多就是这样。
于是发现了这么个东西:
光看了下该方法的声明,这不就是获取对象的大小么,于是没想太多,心想这下问题变得简单了,弄了个premain方法初始化Instrumentation:
public class ObjectSizeUtils { private static Instrumentation inst = null; public static void premain(String agentArgs, Instrumentation inst) { ObjectSizeUtils.inst = inst; } public static long sizeOf(Object o){ if(inst == null) throw new IllegalStateException("not initialized yet"); return inst.getObjectSize(o); } }
export jar并在MANIFEST.MF中加上:
Premain-class: pac.testcase.utils.ObjectSizeUtils Can-Redefine-Classes: false
随便写一个实体类,用来测试:
class Person{ private String name; private String life; public String getName() {return name;} public void setName(String name) {this.name = name;} public String getLife() {return life;} public void setLife(String life) {this.life = life;} }
好了,在运行参数中加上-javaagent,执行看看会输出什么:
@Test public void testSizeUtils(){ Person person = new Person("Alvez","make me death before you make me old"); logger.info(String.valueOf(sizeOf(person))); logger.info(String.valueOf(sizeOf(person.getName()))); logger.info(String.valueOf(sizeOf(person.getLife()))); } static final Logger logger = LoggerFactory.getLogger(ObjectSizeUtils.class);
结果....
为什么person的属性比person还大? 等等,name和life的大小好像也有问题....
回去翻教科书发现事情并不是我希望的那样,我需要把对象里面的元素的大小全部加起来才能达到我要的效果....
看来还需要亲自解决一些事情,于是:
public class ObjectSizeUtils { private static Instrumentation inst = null; public static void premain(String agentArgs, Instrumentation inst) { ObjectSizeUtils.inst = inst; } public static long sizeOf(Object o) throws IllegalAccessException { if(inst == null) throw new IllegalStateException("not initialized yet"); SizeCounter sizeCounter = new SizeCounter(); sizeOf(o, sizeCounter); return sizeCounter.getSize(); } public static void sizeOf(Object o,SizeCounter sizeCounter) throws IllegalAccessException { if(o!=null){ sizeCounter.addSize(inst.getObjectSize(o)); Class c = o.getClass(); Field[] fields = c.getDeclaredFields(); for (Field f : fields) { int mod = f.getModifiers(); if(Modifier.isStatic(mod) || f.getType().isPrimitive()){ continue; } f.setAccessible(true); Object o1 = f.get(o); sizeOf(o1,sizeCounter); } } } } class SizeCounter{ private long size; public long getSize() { return size; } public void setSize(long size) { this.size = size; } public void addSize(long size){ this.setSize(this.getSize() + size); } }
这段代码并不完整,还有很多因素并没有考虑进去,大体思路差不多就是这样。
相关文章推荐
- java如何获取对象在内存中的大小
- http://www.dewen.net.cn/q/6120/如何获取Java对象的大小
- java如何获取一个对象的大小
- 如何获取Java中内存对象的大小? sizeof = ?
- 获取普通Java对象大小
- 获取普通Java对象大小
- C# 如何获取某个类型或类型实例对象的大小
- 如何查看一个java对象的大小
- 普通javaBean如何获取到spring托管对象
- 如何精确地测量java对象的大小-底层instrument API
- C# 如何获取某个类型或类型实例对象的大小
- JS、JAVA等获取当前对象大小以及屏幕分辨率等
- java开发中如何获取远程文件的大小
- 如何精确地测量java对象的大小
- Java乔晓松-Android SD卡路径问题以及如何获取SDCard内存大小
- 关于Java的泛型在所声明的对象中如何获取class或者实例的方法的总结
- java开发中如何获取远程文件的大小
- 实现一个sizeof获取Java对象大小
- 如何查看java对象所占的内存大小
- C# 如何获取某个类型或类型实例对象的大小