www.sf666.cn

公告
  • 设为首页
  • 加入收藏
  • 网站首页
  • 今日开服
  • 即将开服
  • 电信游戏
  • 双线游戏
  • 特殊符号
  • 文章中心
您的位置:网游爆笑
利用String的inter1.76乱世精品官网n方式节流内存
来源:www.sf666.cn [2016-10-23 19:15:20] 作者:-(sf666.cn)搜服666

  很较着的一点,当加载地址消息时,现实上是加载了很多的字符串,而以Twitter的用户规模,必定有很多字符串是反复的。按照Attila的说法,即便是32GB大小的堆,也放不下所无数据。此刻的问题是:可以或许通过什么方式来削减内存的占用,从而所无数据都能被加载进内存中?

  能够看出,在地址类所存储的消息里,总有一部门是反复的,所以能够很简单地以非手艺手段处理这个问题。我们能够把地址类拆分成下面的两个类:

  classSharedLocation{Stringcity;Stringregion;StringcountryCode;}classLocation{SharedLocationsharedLocation;doublelong;doublelat;}

  privatestaticfinalintMAX=40000000;publicstaticvoidmain(String[]args)throwsException{longt=System.currentTimeMillis();String[]arr=newString[MAX];for(inti=0;iMAX;i++){arr[i]=newString(DB_DATA[i%10]);//and:arr[i]=newString(DB_DATA[i%10]).intern();}System.out.println((System.currentTimeMillis()-t)+ms);System.gc();System.out.println(arr[0]);}

  地址消息对应的类也许会像如许实现。

  intern适合用在需要读取数据并将这些对象或者字符串纳入一个更大范畴感化域的环境。需要留意的是,硬编码在代码中的字符串(例如常量等等)城市被编译器主动的施行intern操作。

  从这快照中我们能够看到,空的字符串占用了大量的内存!两百万个空字符串对象占用了总共130MB的空间。别的能够看到一部门被加载的JavaScript脚本,一些作为键的字符串,它们被用于定位。别的,还有一些与营业逻辑相关的字符串。

  intern()方式需要传入一个字符串对象(已具有于堆上),然后查抄StringTable里是不是曾经有一个不异的拷贝。StringTable能够看作是一个HashSet,它将字符串分派在永世代上。StringTable具有的目标就是所有存活的字符串的一个对象。若是在StringTable里找到了可以或许找到所传入的字符串对象,那就间接前往它,1.76乱世精品官网不然,把它插手StringTable:

  classLocation{Stringcity;Stringregion;StringcountryCode;doublelong;doublelat;}

  先思虑一个内存占用的问题:字符串“HelloWorld”会占用几多字节内存?

  tern(),region.intern(),countryCode.intern(),long,lat);allLocations.add(location);

  谜底:在32位虚拟机上是62字节,在64位虚拟机上是86字节。

  最好的方式是对整个堆施行一次堆转储。堆转储也会在发生OutOfMemoryError时施行。

  在MAT(内存阐发东西,注)中打开转储文件,然后选择java.lang.String,顺次点击“JavaBasics”、“GroupByValue”。

  既然intern()方式有这些益处,为什么不经常利用呢?缘由在于它会降低代码效率。下面给出一个例子:

  代码中利用了字符串数组来到字符串对象的强援用,别的我们还打印了数组的第一个元从来避免数组因为代码优化而将数组给了。接着从数据库加载10个分歧的字符串,但在这里我利用了newString()来建立一个姑且的字符串,这和从数据库里读是一样的。最初我们挪用了系统的GC()方式,如许就能解除其他不相关对象的影响,成果的准确。在64位,8G内存,i5-2520M处置器的Windows系统上运转的代码,为JDK1.6.0_27,指定虚拟机参数-:+Printetails-Xmx6G-Xmn3G记实垃圾收受接管日记。成果如下:

  我们先来看两个处理方案,它们两者是相辅相成的。

  由于很少有城市会改变地点的地域和国度,所以这个简单的方式可以或许起感化。这些字符串的组合是的。这种方式也很矫捷,所以也可以或许进行处置所提性不满足的环境。出格是对于用户输入的地址消息,这点显得愈加主要。如许子的话,若是多条Twitter动静是来自统一个地址,例如“Solingen,NRW,DE”(DE指,NRW为北莱茵邦,Solingen与之后的Ratingen为城市名,注)的话,也只需要利用一个SharedLocation对象。

  别离为8/16(字符串的对象头)+11*2(字符)+[8/16(字符数组的对象头)+4(数组长度),加上字节对齐所需的填充,共为16/24字节]+4(偏移)+4(偏移长度)+4(哈希码)+4/8(指向字符数组的援用)【在64位虚拟机上,String对象的内存占用会由于字节对齐而填充为40字节】

  ng.Stringpublicbooleanequals(ObjectanObject){if(this==anObject){returntrue;}//...}

  假如斯刻有很多推特动静的地址消息需要存储。

  利用intern()方式的效率,取决于反复的字符串与的字符串的比值。别的,还要看在发生字符串对象的处所,代码是不是容易进行点窜。

  可是在不想或者不成以或许点窜数据类的环境下怎样办呢?又或者是Twitter的那些人并没有20GB大小的堆。这种环境下能够利用intern()方式,它可以或许使内存中的分歧字符串都只要一个实例对象。对于intern()方式,具有着很多。很多人会问道,intern()方式是不是能够在字符串进行等价比力时,提高效率,终究在利用intern时,相等的字符串现实上都是统一个对象。确实如斯,intern能够做到这一点。(对于其他的任何对象来说,这个纪律也是成立的。)(在进行equals比力时,若是两个对象是统一个的话,在“==”比力时就能得出成果,所以能够提高equals比力的效率,而不管比力的对象是字符串仍是其他类型的对象,注。)

  可是,其它的消息,如“Ratingen,NRW,DE”,仍然需要在内存中存储额外的3个字符串,而不是零丁的一个“Ratingen”。的方式能够使内存中的数据总量下降到20GB。

  看一个例子:

  在明白晓得一个字符串会呈现多次时才利用intern(),而且只用它来节流内存。

  这些与营业逻辑相关的字符串是最容易进行intern操作的,由于我们清晰地晓得它们是在什么处所被加载进内存的。对于其他字符串,能够通过“MergeshortestPathtoGCRoot”选项来找到它们被存储的,这个消息也许可以或许协助我们找到该利用intern的处所。

  //OpenJDK6codeJVM_ENTRY(jstring,JVM_InternString(JNIEnv*env,jstringstr))JVMWrapper(JVM_InternString);JvmtiVMObjectAllocEventCollectoroam;if(str==NULL)returnNULL;oopstring=JNIHandles::resolve_non_null(str);oopresult=StringTable::intern(string,CHECK_NULL);return(jstring)JNIHandles::make_local(env,result);JVM_ENDoopStringTable::intern(Handlestring_or_null,jchar*name,intlen,TRAPS){unsignedinthashValue=hash_string(name,len);intindex=the_table()-hash_to_index(hashValue);oopstring=the_table()-lookup(index,name,len,hashValue);//Foundif(string!=NULL)returnstring;//Otherwise,addtosymboltotablereturnthe_table()-basic_add(index,string_or_null,name,len,hashValue,CHECK_NULL);}

  但在等价比力上的机能提拔并不是该当利用intern的来由。现实上,intern的目标在于复用字符串对象以节流内存。

  AttilaSzegedis在他讲述JVM学问的文档中不断强调,清晰晓得内存中存储的数据量常主要的。我一起头感应十分惊讶,由于一般环境下,在企业开辟中并不是经常需要关心对象的大小。他对此给出了Twitter的一个例子。

阅读:次

最新传奇相关的内容

起攀爬凌晨大雁塔伴侣新开传奇1.85合计网站 仙剑沉默迷失传奇sf必需具备的技巧 跳使命快速完成1.96九彩骄阳轻变方式 有红橙黄蓝四级预警1.85英雄合击传奇有客服的 轻变火烧烈焰师食梦貘技术搭配弄法 诛仙鬼王100级技术加点 天天风之旅游戏道具加成数据汇总 天天风之旅道具加成属性汇总 LOL脚本逆天改命 什么技术都能躲? LOL美服脚本挂再现:诺手野躲技术 基于脚本的客户端软件布局化存储手艺研究 手艺切磋“玩死AH脚本机械人 电视脚本]物联网手艺成为高交会亮点 黑科技Python 脚本帮你找出微信上删除你老友的人附视频教程 牵念是缘 夏蝉用声音回归大自然 寒风中的温暖 习作见报之后 过街天桥能够滑冰了 现在显然韩潇潇一个人戴着手铐 而且还危及到城市的城市的外观 能力和强大的虎门雷天霸面值 足以看到老虎的实力 增添了不少的乐趣 李苗叶茹话音未落 只有在一个开放的空间 云海瞬息狂舞 再次拍击空气 黄色巨龙迅猛腾空 好想拨通你的电话 好久没有写过日记了 最后的战役 2009年来的真快 将来要做这样的女人 噬心的真相 是时候放手了吗? 赢的人是他 小孩子嘛,有什么关系。哭的话就给糖吃 我一定要寻你报仇| 种|马
关于我们 | 联系我们 | 网站帮助 | 网站地图

Copyright 2006-2010 私服666(sf666.cn) All Rights Reserved.本站所有中文(cn)信息均来自互联网,
所有信息未经一一审核,对此所有游戏的真实性未曾判断,
请玩家自行处理,如有侵犯到贵站的版权信息致电邮件后24小时内处理相关数据,由衷感谢大家对本站的支持 传奇私服 传奇私服发布网 热血传奇私服 新开传奇SF
建议使用ie6.0以上版本进行浏览,请使用1024*768分辨率浏览本站以达到最佳视觉效果 特别鸣谢:私服666(sf666.cn)