JAVA网页编程之关于Java占用内存的研讨仓酷云
市场分额,java比asp高一点,因为C#是仿照java开发的,所以哦C#能做的java都能做到,但是java能做的,C#不一定都能做到。毕竟是抄袭吗。 比来对程序占用内存方面做了一些优化,获得了不错的效果,总结了一些履历扼要说一下,信任会对人人写出优良的程序有所匡助
上面的叙述针对32位体系,对64位体系不合用,后叙
常常你写了一个程序,一测试,功效没成绩,一看内存占用也未几,就不往思索别的的工具了。但大概程序利用了一个甚么数据布局,会当数据范围变年夜时,内存占用激增。
基础&&关头的成绩是,Java里各类东东占几内存?????????
关于primitive范例,有8个
byteshortintlongfloatdoublecharboolean它们的长度分离是
12484821
这个不罗嗦了,举例来讲
long[]data=newlong;
占用内存8*1000bytes
别的,data自己是一个Object,也占用内存多少,后叙,固然它针对8*1000来讲,疏忽不计
再说Object的占用,在说这个之前,先说说援用,一惯的说法是
Java里没有指针了,只要援用,援用是平安的
这个说法没错,可是从机理下去说,援用就是指针,只是jvm对指针的利用反省和限定良多,这个援用/指针变得很平安
间接来结论:一个援用占4byte,在32位体系上 Objectobj=null;//4byte
Object[]objs=newObject;//最少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;
for(inti=0;i<1000;i++){
objs=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;
占用空间几?
答:约为(最少为)(16+4)*1000bytes
好家伙!!!!!!!!
论题:数组空间占用怎样算?
我这里间接给结论了,推导这个花了更长的工夫:
关于数组来讲,数组这个Object有一个length属性,数组的元素相称于其成员 publicclassArray{
publicintlength;
//...别的成员
} 关于数组,我们不是间接能够取length属性么,源于此
publicbyte[]bytes=newbyte;
System.out.println(bytes.length);//看,有length属性
下面的bytes换算过去是: publicclassArray{
publicintlength;
publicbytebyte0;
publicbytebyte1;
...
publicbytebyte999;
} 下面的bytes占用的内存是:
4+=4+=4+1016=1020
4是bytes这个援用,8是Object基占的,4是length属性占的
1000是1000个成员占的,原本是1012,但请求是8的倍数,酿成1016了
统共是1020
再如:
byte[]bytes=newbyte;
的内存占用是:
4+=4+=20;
byte[]bytes=newbyte;也是20
关于元素是Object的数组,Object也是看成其成员,(注重只要援用这个数组的空间,这个能够推到一般Class上)
Byte[]bytes=newByte;
这个bytes的界说相称于: publicclassArray{
publicintlength;
publicBytebyte0;
.....
publicBytebyte999;
} 占用空间是:
4++16*1000=4+4016+16000=你本人算吧
推论:万万不要用Byte[]有20倍的差异!!!!!!!
你大概一会儿没分明过去,不妨多揣摩一下,关于一般的class来讲
,内容占用就是基加成员的占用,Object成员只记援用 publicclassAbc{
publicintn;
publicbyteb;
publicObjectobj;
} 它的内容占用是:=24
以是Abcone=newAbc()的占用是4+24=28
提示:关于Abc的成员obj没有计,假如要计进的话,轮回这个历程就能够了。(揣摩一下)
举例:
publicclassAbc{
publicbyteb;
publicObjectobj=null;
}
publicclassDef{
publicintn;
publicbyteb;
publicAbcobj=newAbc();
}
问:
Defone=newDef();//占几?
答:
4++=4+24+16=44
publicclassAbc{
publicbyteb;
publicObjectobj=null;
}
publicclassDef{
publicintn;
publicbyteb;
publicAbc[]objs=newAbc;
{
for(inti=0;i<10;i++){
objs=newAbc();
}
}
}
问:
Defone=newDef();//占几?
答:
kao,一下我也算不出来,不外我写了程序,能够算出来,你给它一个Object,它就可以递回的算出统共占了几内存,这个程序不庞大,你也能够写出来。我等时机符合了再放出。
独自说一下String,String的布局是: publicclassString{
privatefinalcharvalue[];
privatefinalintoffset;
privatefinalintcount;
privateinthash;//Defaultto0
} 以是,不思索谁人char[]的占用,一个String起码占用=24bytes
加上援用,共28bytes
以是
Strings="";
占用28bytes!!!!!只管它的长度为0
假如准确的算,加上援用一个String的占用是
4+24+
Strings="";的占用是28+16=44
Strings="ab"的占用是28+16=44
Strings="abc"的占用是28+24=52
要说的是,String是经常使用的类,这么看,String耗内存良多,以是jvm有优化,一样的内容只管重用,以是除28是必需的外,谁人char[]极可能一样
例如说 String[]s=newString;
for(inti=0;i<1000;i++){
s=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本书足以,这就是区别。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 Java是一种计算机编程语言,拥有跨平台、面向对java 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 是一种使网页(Web Page)产生生动活泼画面的语言 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧 《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
页:
[1]