仓酷云

标题: JAVA网页编程之关于Java占用内存的研讨仓酷云 [打印本页]

作者: 灵魂腐蚀    时间: 2015-1-18 11:36
标题: JAVA网页编程之关于Java占用内存的研讨仓酷云
市场分额,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本书足以,这就是区别。
作者: 深爱那片海    时间: 2015-1-21 10:56
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 分手快乐    时间: 2015-1-30 16:07
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 蒙在股里    时间: 2015-2-1 22:10
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 莫相离    时间: 2015-2-7 15:22
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 金色的骷髅    时间: 2015-2-8 06:22
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 简单生活    时间: 2015-2-16 06:08
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 谁可相欹    时间: 2015-2-25 10:44
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 若相依    时间: 2015-2-27 21:24
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 乐观    时间: 2015-3-2 15:47
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
作者: 海妖    时间: 2015-3-11 04:28
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
作者: 小魔女    时间: 2015-3-17 20:10
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 柔情似水    时间: 2015-3-24 23:41
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 再现理想    时间: 2015-4-1 13:14
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 再见西城    时间: 2015-4-4 08:01
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
作者: 兰色精灵    时间: 2015-4-4 13:21
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
作者: 透明    时间: 2015-4-13 20:19
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 因胸联盟    时间: 2015-5-1 14:07
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者: 冷月葬花魂    时间: 2015-6-18 00:04
所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。
作者: 灵魂腐蚀    时间: 2015-7-4 23:06
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2