您好,欢迎光临 | 我的主页 | 个人资料 | 短消息 | 好友 | 书签 | 黑名单 |
http://www.javayou.com (添加到收藏夹,设为首页)
当你不能再拥有时,你唯一能做的,就是让自己不要忘记 (手机请访问 http://3g.dlog.cn/javayou)

Java 5 得到对象在内存中的大小

2005年8月18日(Thursday) 22点03分 作者: 泽欣 天气: 心情: 挺好

java.sun.com 上这几天都在宣传大家移植到java 5,我觉得时机也确实成熟了,Tiger 确实带来了许多改进,否则也不至于从1.5毅然改名为5。

今天吸引我注意的是新引进的 java.lang. instrument 库,支持用java语言来测绘虚拟机中运行的程序。看API 不太好懂,只是有个getObjectSize() 的方法可以得到对象在内存中的容量大小。这个调试的时候通常用得上。测试程序如下:

public class InstrumentationTest {
   private static Instrumentation inst;

   public static void premain(String options, Instrumentation inst) {
      InstrumentationTest.inst = inst;
      System.out.println("options= " + options);
      // Get all classes currently loaded by VM
      Class[] loaded = inst.getAllLoadedClasses();

      //And print them!
      for (Class clazz : loaded) {
         System.out.println(clazz);
      }
   }

   public static long sizeOf(Object o) {
      assert inst != null;
      return inst.getObjectSize(o);
   }

   public static void main(String[] args) {
      System.out.println("Size of Object: " + sizeOf(new Object()));
      System.out.println("Size of direct subclass: " + sizeOf(
            new InstrumentationTest()));
      System.out.println("Size of Calendar: " + sizeOf(Calendar.getInstance()));
   }
}

调试的主类需要一个名为 premain 的方法,虚拟机在运行的时候会调用该方法,上例中利用premain 方法来得到一个 Instrumentation 对象。代码参考 blog : http://weblogs.java.net/blog/mister__m/archive/2004/02/playing_with_th_1.html

编译:

 javac -source 1.5 InstrumentationTest.java


接下来打包为 inst_test.jar。
manifest 文件中记得要设置属性 Premain-Class: InstrumentationTest
然后就可以试试了:

java -ea -javaagent:inst_test.jar  -cp . InstrumentationTest

结果和我们以前了解的一样,一个单纯的Object对象占用8k内存,而Calendar 的一个实例占用112k,所以《Effective Java》第4条用Calendar的例子告诉我们,不要重复创建对象。

标签: java 
通过电脑发布 #1楼 评论时间:2005-11-18 16:11 (Friday)

"一个单纯的Object对象占用8k内存,而Calendar 的一个实例占用112k,"

楼主真强 :))))))))

 

邮箱 | 网址 |  
姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验