创意安天

 找回密码
 注册创意安天

计算Java Serializable对象大小的方法

[复制链接]
发表于 2010-3-16 10:42 | 显示全部楼层 |阅读模式
在Cahce的设计中,一般会考虑两种对象管理方法,一是按对象大小,比如开一个10M字节的cahce空间。另外一个是按对象的数量,比如1000个对象的cache空间。
  对于按对象尺寸管理的cache,由于Java对象的实际内存大小不好获得(我是不知道如何计算的),所以一般就使用一个Serializable对象的序列化尺寸来代替,序列化时通常把一个对象序列化到一个字节buffer里,那么就可以获得这个buffer的字节数。今天,在工作中,突软想到这样做太浪费空间,看了Java的ObjectOutputStream这个类的源码,发现也可以如下做,只计数,不产生字节转移,那么就不会耗费内存空间了。
  public final class SizeCalculator {
  public static int calcSize(java.io.Serializable o) {
  int ret = 0;
  class DumbOutputStream extends OutputStream {
  int count = 0;
  public void write(int b) throws IOException {
  count++; // 只计数,不产生字节转移
  }
  }
  DumbOutputStream buf = new DumbOutputStream();
  ObjectOutputStream os = null;
  try {
  os = new ObjectOutputStream(buf);
  os.writeObject(o);
  ret = buf.count;
  } catch (IOException e) {
  // No need handle this exception
  e.printStackTrace();
  ret = -1;
  } finally {
  try {
  os.close();
  } catch (Exception e) {
  }
  }
  return ret;
  }
  public static void main(String[] args){
  System.err.println(calcSize(1));
  }
  }

本文来自“北大青鸟济南新东方(山东大学)校区”网站 http://www.0531accp.com 
原文链接:http://www.0531accp.com/zxzx/show___id=483.html
您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

小黑屋|手机版|Archiver|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2024-4-29 00:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表