Chinaunix首页 | 论坛 | 博客
  • 博客访问: 484127
  • 博文数量: 55
  • 博客积分: 1867
  • 博客等级: 上尉
  • 技术积分: 587
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-29 01:33
文章分类

全部博文(55)

文章存档

2013年(1)

2012年(2)

2011年(16)

2010年(11)

2009年(5)

2008年(10)

2007年(8)

2006年(2)

分类: Java

2010-01-23 01:00:46

  在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));
    }



阅读(1285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~