轉(zhuǎn)帖|其它|編輯:郝浩|2010-07-14 13:45:08.000|閱讀 642 次
概述:在Cahce的設(shè)計(jì)中,一般會(huì)考慮兩種對(duì)象管理方法,一是按對(duì)象大小,比如開一個(gè)10M字節(jié)的cahce空間。另外一個(gè)是按對(duì)象的數(shù)量,比如1000個(gè)對(duì)象的cache空間。本文將講述計(jì)算Java Serializable對(duì)象大小的方法。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在Cahce的設(shè)計(jì)中,一般會(huì)考慮兩種對(duì)象管理方法,一是按對(duì)象大小,比如開一個(gè)10M字節(jié)的cahce空間。另外一個(gè)是按對(duì)象的數(shù)量,比如1000個(gè)對(duì)象的cache空間。
對(duì)于按對(duì)象尺寸管理的cache,由于Java對(duì)象的實(shí)際內(nèi)存大小不好獲得(我是不知道如何計(jì)算的),所以一般就使用一個(gè)Serializable對(duì)象的序列化尺寸來代替,序列化時(shí)通常把一個(gè)對(duì)象序列化到一個(gè)字節(jié)buffer里,那么就可以獲得這個(gè)buffer的字節(jié)數(shù)。今天,在工作中,突軟想到這樣做太浪費(fèi)空間,看了Java的ObjectOutputStream這個(gè)類的源碼,發(fā)現(xiàn)也可以如下做,只計(jì)數(shù),不產(chǎn)生字節(jié)轉(zhuǎn)移,那么就不會(huì)耗費(fèi)內(nèi)存空間了。
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++; // 只計(jì)數(shù),不產(chǎn)生字節(jié)轉(zhuǎn)移
}
}
DumbOutputStream buf = new DumbOutputStream();
ObjectOutputStream s = 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));
}
?。?/p>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載