|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。 比来对程序占用内存方面做了一些优化,获得了不错的效果,总结了一些履历
扼要说一下,信任会对人人写出优良的程序有所匡助
上面的叙述针对32位体系,对64位体系不合用,后叙
常常你写了一个程序,一测试,功效没成绩,一看内存占用也未几,就不往思索别的的工具了。但大概程序利用了一个甚么数据布局,会当数据范围变年夜时,内存占用激增。
基础&&关头的成绩是,Java里各类东东占几内存?????????
关于primitive范例,有8个
byteshortintlongfloatdoublecharboolean它们的长度分离是
12484821
这个不罗嗦了,举例来讲
long[]data=newlong[1000];
占用内存8*1000bytes
别的,data自己是一个Object,也占用内存多少,后叙,固然它针对8*1000来讲,疏忽不计
再说Object的占用,在说这个之前,先说说援用,一惯的说法是
Java里没有指针了,只要援用,援用是平安的
这个说法没错,可是从机理下去说,援用就是指针,只是jvm对指针的利用反省和限定良多,这个援用/指针变得很平安
间接来结论:一个援用占4byte,在32位体系上 Objectobj=null;//4byte
Object[]objs=newObject[1000];//最少4*1000byte 你看我界说了一个obj,仍是null,就占4byte
界说了一个objs,1000个元素,但都是null啊,就都每一个占4byte
是的!!!!!
固然obj==null,但它已是一个援用,大概说一个指针了
指针也要占中央啊!!!!啊!!!!啊!!!!
接上去,间接给另外一个结论:Object占8byte,注重,纯Object
Objectobj=newObject();//几????
8byte??错!!12byte,忘了另有一个援用,8byte是Object的内容
记着Objectobj=newObject();占12byte Object[]objs=newObject[1000];
for(inti=0;i<1000;i++){
objs[i]=newObject();
} 最少占用12*1000bytes
推论:Object占12bytes,仿佛和下面的结论冲突??!!
没有!!不论Object,没有被渣滓接纳之前,总得被他人援用吧?
总的有指针指它吧?既然指,谁人援用or指针就要占中央啊4byte
加起来是12byte,归正一个Object最少12bytes
仍是间接给结论,推导的历程我就都包揽了,咱不是脏活累活抢着干么!!
一个Integer占16bytes
这时候您大概会有疑问,Integer=Object+int,就是: publicclassInteger{
publicintvalue;
} Integer应当占8+4=12bytes啊
你说的有事理,可是jvm对一切的Object无限制!!
这个限定被我发明了,就是不论甚么Object占的空间,如果8的倍数
12不是8的倍数,只能是16了!!!
推论:Byte也占16bytes!!!!!!!!!!!
问:
Byte[]bytes=newByte[1000];
占用空间几?
答:约为(最少为)(16+4)*1000bytes
好家伙!!!!!!!!
论题:数组空间占用怎样算?
我这里间接给结论了,推导这个花了更长的工夫:
关于数组来讲,数组这个Object有一个length属性,数组的元素相称于其成员 publicclassArray{
publicintlength;
//...别的成员
} 关于数组,我们不是间接能够取length属性么,源于此
publicbyte[]bytes=newbyte[1000];
System.out.println(bytes.length);//看,有length属性
下面的bytes换算过去是: publicclassArray{
publicintlength;
publicbytebyte0;
publicbytebyte1;
...
publicbytebyte999;
} 下面的bytes占用的内存是:
4+[8+4+1*1000]=4+[1012]=4+1016=1020
4是bytes这个援用,8是Object基占的,4是length属性占的
1000是1000个成员占的,原本是1012,但请求是8的倍数,酿成1016了
统共是1020
再如:
byte[]bytes=newbyte[4];
的内存占用是:
4+[8+4+4*1]=4+[16]=20;
byte[]bytes=newbyte[3];也是20
关于元素是Object的数组,Object也是看成其成员,(注重只要援用这个数组的空间,这个能够推到一般Class上)
Byte[]bytes=newByte[1000];
这个bytes的界说相称于: publicclassArray{
publicintlength;
publicBytebyte0;
.....
publicBytebyte999;
} 占用空间是:
4+[8+4+4*1000]+16*1000=4+4016+16000=你本人算吧
推论:万万不要用Byte[]有20倍的差异!!!!!!!
你大概一会儿没分明过去,不妨多揣摩一下,关于一般的class来讲
,内容占用就是基加成员的占用,Object成员只记援用 publicclassAbc{
publicintn;
publicbyteb;
publicObjectobj;
} 它的内容占用是:[8+4+1+4]=24
以是Abcone=newAbc()的占用是4+24=28
提示:关于Abc的成员obj没有计,假如要计进的话,轮回这个历程就能够了。(揣摩一下)
举例:
publicclassAbc{
publicbyteb;
publicObjectobj=null;
}
publicclassDef{
publicintn;
publicbyteb;
publicAbcobj=newAbc();
}
问:
Defone=newDef();//占几?
答:
4+[8+4+1+4]+[8+1+4]=4+24+16=44
publicclassAbc{
publicbyteb;
publicObjectobj=null;
}
publicclassDef{
publicintn;
publicbyteb;
publicAbc[]objs=newAbc[100];
{
for(inti=0;i<10;i++){
objs[i]=newAbc();
}
}
}
问:
Defone=newDef();//占几?
答:
kao,一下我也算不出来,不外我写了程序,能够算出来,你给它一个Object,它就可以递回的算出统共占了几内存,这个程序不庞大,你也能够写出来。我等时机符合了再放出。
独自说一下String,String的布局是: publicclassString{
privatefinalcharvalue[];
privatefinalintoffset;
privatefinalintcount;
privateinthash;//Defaultto0
} 以是,不思索谁人char[]的占用,一个String起码占用[8+4+4+4+4]=24bytes
加上援用,共28bytes
以是
Strings="";
占用28bytes!!!!!只管它的长度为0
假如准确的算,加上援用一个String的占用是
4+24+[8+4+2*length]
Strings="";的占用是28+16=44
Strings="ab"的占用是28+16=44
Strings="abc"的占用是28+24=52
要说的是,String是经常使用的类,这么看,String耗内存良多,以是jvm有优化,一样的内容只管重用,以是除28是必需的外,谁人char[]极可能一样
例如说 String[]s=newString[1000];
for(inti=0;i<1000;i++){
s[i]=newString("abcdefasdjflksadjflkasdfj");
} 的占用的数目级是28*1000,那1000个字符串自己基础上不占内存,只要一份!!!!!!
归正String最少是28,最多也多是28!!!!!!!!
对照占内存的数据布局,这个很主要:
基础上就是primitive的包装
实例:
我之前用一个
Hashtable的布局,有100万个元素
改成String[]+int[]后,内存占用变动很多,速率也很快
100万的String[]快排一下,也就2秒多,查找用2分,和hash也差未几少
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net网页编程也不过3,4本书足以,这就是区别。 |
|