当前位置: 首页 > news >正文

自己建设网站不会咋办呀photoshop网页版在线使用

自己建设网站不会咋办呀,photoshop网页版在线使用,深圳代理记账行业协会,硬件开发工具有哪些在这篇文章中#xff0c;我们来了解一下让代码变得高效的五种技巧#xff0c;这些技巧可以使我们的垃圾收集器#xff08;GC#xff09;在分配内存以及释放内存上面#xff0c;占用更少的CPU时间#xff0c;减少GC的开销。当内存被回收的时候#xff0c;GC处理很长时间经… 在这篇文章中我们来了解一下让代码变得高效的五种技巧这些技巧可以使我们的垃圾收集器GC在分配内存以及释放内存上面占用更少的CPU时间减少GC的开销。当内存被回收的时候GC处理很长时间经常会导致我们的代码中断又叫做”stop the world”。 背景 GC用来处理大量的短期的对象的分配试想打开一个web页面一旦页面被加载之后被分配内存的大部分对象都会被废弃。 GC使用一个被称作”新生代”堆空间来完成这件事情。”新生代”是用来存放新建对象的堆内存。每一个对象都有一个”age”存储在对象的头信息中用来定义存放很多没有被回收的垃圾集合。一旦一个确定的”age”到达对象就会被复制到堆中的另一块空间这个空间被称作”幸存者空间”或者”老年代空间”。译者注实际上幸存者空间位于新生代空间中原文有误不过这里暂时按照原文来翻译更详细的内容请点击成为JavaGC专家Part I — 深入浅出Java垃圾回收机制 虽然这样很有效但是还是有很大代价的。减少临时分配的数量确实可以帮助我们增加吞吐量尤其是在大规模数据的环境下或者资源有限制的app中。 下面的五种代码方式可以更加有效的利用内存并且不需要花费很多的时间也不会降低代码可读性。 1、避免隐式的String字符串 String字符串是我们管理的每一个数据结构中不可分割的一部分。它们在被分配好了之后不可以被修改。比如””操作就会分配一个链接两个字符串的新的字符串。更糟糕的是这里分配了一个隐式的StringBuilder对象来链接两个String字符串。 例如 1 a a b; // a and b are Strings 编译器在背后就会生成这样的一段儿代码 1 2 3 4 StringBuilder temp new StringBuilder(a). temp.append(b); a temp.toString(); // 一个新的 String 对象被分配 // 第一个对象 “a” 现在可以说是垃圾了 它变得更糟糕了。 让我们来看这个例子 1 2 3 String result foo() arg; result boo(); System.out.println(“result “ result); 在这个例子中背后有三个StringBuilders 对象被分配 – 每一个都是””的操作所产生和两个额外的String对象一个持有第二次分配的result另一个是传入到print方法的String参数在看似非常简单的一段语句中有5个额外的对象。 试想一下在实际的代码场景中会发生什么例如通过xml或者文件中的文本信息生成一个web页面的过程。在嵌套循环结构你将会发现有成百上千的对象被隐式的分配了。尽管VM有处理这些垃圾的机制但还是有很大代价的 – 代价也许由你的用户来承担。 解决方案 减少垃圾对象的一种方式就是善于使用StringBuilder 来建对象下面的例子实现了与上面相同的功能然而仅仅生成了一个StringBuilder 对象和一个存储最终result 的String对象。 1 2 3 StringBuilder value new StringBuilder(“result “); value.append(foo()).append(arg).append(boo()); System.out.println(value); 通过留心String和StringBuilder被隐式分配的可能可以减少分配的短期的对象的数量尤其在有大量代码的位置。 2、计划好List的容量 像ArrayList这样的动态集合用来存储一些长度可变化数据的基本结构。ArrayList和一些其他的集合如HashMap、TreeMap底层都是通过使用Object[]数组来实现的。而String它们自己包装在char[]数组中char数组的大小是不变的。那么问题就出现了如果它们的大小是不变的我们怎么能放item记录到集合中去呢答案显而易见分配更多的数组。 看下面的例子 1 2 3 4 5 6 7 ListItem items new ArrayListItem();    for (int i 0; i len; i) { Item item readNextItem(); items.add(item); } len的值决定了循环结束时items 最终的大小。然而最初ArrayList的构造器并不知道这个值的大小构造器会分配一个默认的Object数组的大小。一旦内部数组溢出它就会被一个新的、并且足够大的数组代替这就使之前分配的数组成为了垃圾。 如果执行数千次的循环那么就会进行更多次数的新数组分配操作以及更多次数的旧数组回收操作。对于在大规模环境下运行的代码这些分配和释放的操作应该尽可能从CPU周期中剔除。 解决方案 无论什么时候尽可能的给List或者Map分配一个初始容量就像这样 1 ListMyObject items new ArrayListMyObject(len); 因为List初始化有足够的容量所有这样可以减少内部数组在运行时不必要的分配和释放。如果你不知道确定的大小最好估算一下这个值的平均值添加一些缓冲防止意外溢出。 3、使用高效的含有原始类型的集合 当前版本的Java编译器对于含有基本数据类型的键的数组以及Map的支持是通过“装箱”来实现的 – 自动装箱就是将原始数据装入一个对应的对象中这个对象可被GC分配和回收。 这个会有一些负面的影响。Java可以通过使用内部数组实现大多数的集合。对于每一条被添加到HashMap中的key/value记录都会分配一个存储key和value的内部对象。当处理map的时候非常可怕这意味着每当你放一条记录到map中的时候就会有一次额外的分配和释放操作发生。这很可能导致数量过大而不得不重新分配新的内部数组。当处理有成百上千条甚至更多记录的Map时这些内部分配的操作将会使GC的成本增加。 一种常见的情况就是保存一个原始类型如id和一个对象之间的映射。由于Java的HashMap设计只能包含对象类型而非原始类型这意味着每个map的插入操作都可能分配一个额外的对象来存储原始类型即装箱。 Integer.valueOf 方法缓存在-128 – 127之间的数值但是对于范围之外的每一个数值除了内部的key/value记录对象之外一个新的对象也将会分配。这很可能超过了GC对于map三倍的开销。对于一个C开发者来说这真是让人不安的消息在C中STL 模板可以非常高效地解决这样的问题。 很幸运这个问题将会在Java的下一个版本得到解决。到那时这将会被一些提供基本的树形结构(Tree)、映射Map以及List等Java的基本类型的库迅速处理。我强力推荐Trove我已经使用很长时间了并且它在处理大规模的代码时真的可以减小GC的开销。 4、使用数据流Streams代替内存缓冲区in-memory buffers 在服务器应用程序中我们操作的大多数的数据都是以文件或者是来自另一个web服务器或DB的网络数据流的形式呈现给我们。大多数情况下传入的数据都是序列化的形式在我们使用它们之前需要被反序列化成Java对象。这个过程非常容易产生大量的隐式分配。 最简单的做法就是通过ByteArrayInputStream,ByteBuffer 把数据读入内存中然后再进行反序列化。 这是一个糟糕的举动因为完整的数据在构造新的对象的时候你需要为其分配空间然后立刻又释放空间。并且由于数据的大小你又不知道你只能猜测 – 当超过初始化容量的时候不得不分配和释放byte[]数组来存储数据。 解决方案非常简单。像Java自带的序列化工具以及Google的Protocol Buffers等它们可以将来自于文件或网络流的数据进行反序列化而不需要保存到内存中也不需要分配新的byte数组来容纳增长的数据。如果可以的话你可以将这种方法和加载数据到内存的方法比较一下相信GC会很感谢你的。 5、List集合 不变性是很美好的但是在大规模情境下它就会有严重的缺陷。当传入一个List对象到方法中的情景。 当方法返回一个集合通常会很明智的在方法中创建一个集合对象如ArrayList填充它并以不变的集合的形式返回。 有些情况下这并不会得到很好的效果。最明显的就是当来自多个方法的集合调用一个final集合。因为不变性在大规模数据情况下会分配大量的临时集合。 这种情况的解决方案将不会返回新的集合而是通过使用单独的集合当做参数传入到那些方法代替组合的集合。 例子1低效率 1 2 3 4 5 6 ListItem items new ArrayListItem(); for (FileData fileData : fileDatas) { // 每一次调用都会创建一个存储内部临时数组的临时的列表 items.addAll(readFileItem(fileData)); } 例子2 1 2 3 4 5 6 7 ListItem items new ArrayListItem(fileDatas.size() * avgFileDataSize * 1.5);    for (FileData fileData : fileDatas) { readFileItem(fileData, items); // 在内部添加记录 } 在例子2中当违反不变性规则的时候这通常应该被遵守可以节省N个list的分配以及任何临时数组的分配。这将是对你GC的一个大大的优惠。 转载于:https://www.cnblogs.com/xianDan/p/4846820.html
http://www.zqtcl.cn/news/877115/

相关文章:

  • 合肥公司做网站网站代码需要注意什么
  • 梧州网站制作公司高端网站开发公司有哪些
  • seo网站设计北京做app的公司有哪些
  • 佛山淘宝设计网站设计价格软件商城免费下载 app
  • 物联网型网站开发cms系统源码
  • 淘宝价格网站建设wordpress 点餐
  • 晋中网站建设公司汉滨区城乡建设规划局 网站
  • 2018年的网站制作湖北省随州市建设厅网站
  • 做网络销售保温材料用什么网站好企业网站的建设企业
  • 2008发布asp网站海外如何 淘宝网站建设
  • 小米云网站开发食品包装
  • 销售网站怎么做的帝国cms网站搬家教程
  • 甘肃省城市建设档案馆网站wordpress推广自己淘宝店
  • 专业做曝光引流网站国家反诈中心app下载流程
  • 深圳校园网站建设响应式手机网站制作
  • 景县住房和城乡规划建设局网站我想买个空间自己做网站
  • 网站建设申请计划宣传片拍摄方案模板
  • 网站开发项目经验描述html网站开发事例教程
  • 998元网站建设优化网站建设实训报告心得体会
  • 网站经营性备案流程搜索引擎优化的简写是
  • 长春制作网站南昌建站系统外包
  • 在火炉做网站公园坐什么车hexo wordpress 比较
  • 好的免费博客网站设计图软件
  • 网站建设合同电子版金融网站建设运营方案
  • 网站域名备案在哪里贵阳经济技术开发区网站
  • 戴尔公司网站建设成功的关键是什么网站商城建设公司
  • 用python做 网站论坛南宁网站建设 南宁联达亿
  • 做婚恋网站要多少钱网站首页页面设计多少钱
  • 营销型网站建设试卷wordpress怎么备份按在
  • 手机网站有什么区别是什么意思wordpress 推送公众号