六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 40|回复: 0

计算Java Serializable对象大小的方法

[复制链接]

升级  30%

3

主题

3

主题

3

主题

童生

Rank: 1

积分
15
 楼主| 发表于 2013-1-15 02:41:50 | 显示全部楼层 |阅读模式
在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));  }  } 

 
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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