仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1452|回复: 19
打印 上一主题 下一主题

[学习教程] JAVA网页编程之关于Java占用内存的研讨仓酷云

[复制链接]
灵魂腐蚀 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:36:24 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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本书足以,这就是区别。
灵魂腐蚀 该用户已被删除
沙发
 楼主| 发表于 2015-7-4 23:06:27 | 显示全部楼层
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-21 21:54

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表