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

临夏州住房和城乡建设局网站个人网站设计过程

临夏州住房和城乡建设局网站,个人网站设计过程,金币交易网站开发,萧山网站建设那家好目录 垃圾回收算法 评价标准: 标记-清除算法: 复制算法: 标记-整理算法: 分代GC: arthas查看分代之后的内存情况: 垃圾回收算法 java是如何实现垃圾回收的呢?简单来说,垃圾回…

目录

垃圾回收算法

评价标准:

标记-清除算法:

复制算法:

标记-整理算法:

分代GC:

arthas查看分代之后的内存情况:


垃圾回收算法

  • java是如何实现垃圾回收的呢?简单来说,垃圾回收要做的有两件事:
  1. 找到内存中存活的对象
  2. 释放不再存活对象的内存,使得程序能再次利用这部分空间。
Java垃圾回收过程会通过单独的GC线程来完成,但是不管使用哪一种GC算法,都会有部分阶段需要停止所有的用户线程。这个过程被称之为Stop The World 简称 STW,如果STW时间过长则会影响用户的使用。
评价标准:
判断GC算法是否优秀,可以从三个方面来考虑:
  1. 吞吐量:
    1. 吞吐量指的是CPU用于执行用户代码的时间与CPU总执行时间的比值,即吞吐量=执行用户代码时间/(执行用户代码时间+GC时间)。吞吐量数值越高,垃圾回收的效率就越高。
  2. 最大暂停时间
    1. 最大暂停时间指的是所有在垃圾回收过程中的STW时间最大值。比如如下的图中,黄色部分的STW就是最大暂停时间,显而易见上面的图比下面的图拥有更少的最大暂停时间。最大暂停时间越短,用户使用系统时收受到的影响就越短。
  1. 堆使用效率
    1. 不同的垃圾回收算法,对堆内存的使用方式是不同的。比如标记清除算法,可以使用完整的堆内存。而复制算法会将堆内存一分为二,每次只能使用一半的内存。从堆使用效率上来说,标记-清除算法要优于复制算法。
上述三种评价标准:堆使用效率、吞吐量,以及最大暂停时间不可兼得。
一般来说,对内存越大,最大暂停时间就会越长。想要减少最大暂停时间,就会降低吞吐量。
标记-清除算法:
【GC算法几人知?】二、标记清除法 全解析-CSDN博客
标记清楚算法的核心思想分为两个阶段:
  1. 标记阶段,将所有存活的对象进行标记。java中使用可达性分析算法,从GC Root开始通过引用链遍历出所有存活对象。
  2. 清除阶段,从内存中删除没有被标记也就是非存活对象。
  • 优点:
    • 实现简单,只需要再第一阶段给每个对象维护标志位,第二阶段删除对象即可。
  • 缺点:
复制算法:
复制算法的核心思想是:
  1. 堆中准备两块空间From空间和To空间,每次在对分配阶段,只能使用其中一块空间(From空间)。
  2. 在垃圾回收GC阶段,将From中存活的对象复制到To空间。
  3. 将两块空间的From和To名字呼唤。
完整的例子:
  1. 将堆内存分割成两块From空间和To空间,对象分配阶段,创建对象。
  2. GC阶段开始,将GCRoot搬运到To空间
  3. 将GCRoot关联的对象,搬运到To空间
  4. 清理From空间,并将名称互换。
优点:
  1. 吞吐量高
    1. 复制算法只需要遍历一次存活对象复制到To空间即可,比标记-整理算法少了一次遍历的过程,因而性能较好,但是不如标记-清除算法,因为标记清除算法不需要进行对象的移动。
  2. 不会发生碎片化
    1. 复制算法在复制之后就会将对象按顺序放入To空间中,所以对象以外的区域都是可用空间,不存在碎片化内存空间。
缺点:
  1. 内存使用效率低
    1. 每次只能让一半的内存空间来为创建对象使用
标记-整理算法:
标记整理算法也叫做标记压缩算法,是对标记清理算法中容易产生内存碎片问题的一种解决方案。
  1. 标记阶段,将所有存活的对象进行标记。java中使用可达性分析算法,从GCRoot开始通过引用链遍历出所有存活的对象。
  2. 整理阶段,将存活对象移动到堆的一端。清理掉存活对象的内存空间。
优点:
  1. 内存使用效率高
    1. 整个堆内存都可以使用,不会像复制算法只能使用半个堆内存
  2. 不会发生碎片化
    1. 在整理阶段可以将对象往内存的一次进行移动,剩下的空间都是可以分配对象的有效空间。
缺点:
  1. 整理阶段的效率不高
    1. 整理算法有很多种,比如Lisp2整理算法需要对整个堆中的对象搜索3次,整体性能不佳。可以通过Two-Finger、表格算法、ImmisGC等高效的整理算法优化此阶段的性能。
分代GC:
现代优秀的垃圾回收算法,会将上述描述的垃圾回收算法组合进行使用,其中应用最广泛的就是分代垃圾回收算法。
分代垃圾回收将整个内存区域划分为年轻代和老年代:
  • 年轻代:(新生代)Young区,存放存活时间比较短的对象
  • 老年代:old区,存放存活时间比较长的对象
arthas查看分代之后的内存情况:
  • 在JDK8中,添加-XX:+UseSerialGC参数使用分代回收的垃圾回收器,运行程序。
  • 在arthas中使用memory命令查看内存,显示出三个区域的内存情况。
分代回收时,创建出来的对象,首先会被放入Eden伊甸园区。
随着对象在Eden去越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC或者Young GC。
Minor GC会把需要eden中和From需要回收的对象回收,把没有回收的对象放入To区。
接下来,S0会变成To区,S1变成From区。当eden区满时再往里放入对象,依然会发生Minor GC。此时会回eden区和S1(from)中的对象,并把eden和from区中剩余的对象放入S0。
注意:每次Minor GC中都会为对象记录他的年龄,初始值为0,每次GC完加1。
如果Minor GC后对象的年龄达到阈值(最大15,默认值和垃圾回收器有关),对象就会被晋升至老年代。
当老年代中空间不足,无法放入新的对象时,先尝试minor gc如果还是不足,就会触发Full GC,Full GC会对整个堆进行垃圾回收。
如果FullGC依然无法回收掉老年代的对象,那么当对象继续放入老年代时,就会抛出Out Memory异常。
问题:下图中的程序为什么会出现OutOfMemory?
从上图可以看到,Full GC 无法回收掉老年代的对象,那么当对象继续放入老年代时,就会抛出Out Of Memory异常。
问题:分代GC算法要把堆分为年轻代和老年代?
  • 系统中的大部分对象,都是创建出来之后很快就不再使用可以被回收,比如用户获取订单数据,订单数据返回给用户之后就可以释放了。
  • 老年代中会存放长期存活的对象,比如Spring的大部分bean对象,在程序启动之后就不会被回收了
  • 在虚拟机的默认设置中,新生代大小要远小于老年代的大小。
问题:分代GC算法将堆分成年轻代和老年代的主要原因有:
  1. 可以通过调整年轻代和老年代的比例老师应不同类型的应用程序,提高内存的利用率和性能。
  2. 新生代和老年代时用不同的垃圾回收算法,新生代一般选择复制算法,老年代可以选择标记-清除和标记-整理算法,由程序员来选择灵活度较高。
  3. 分代的设计中允许只回收新生代,如果能满足对象分配的要求就不需要对整个堆进行回收(full GC),STW时间就会减少。
http://www.dtcms.com/wzjs/815930.html

相关文章:

  • 丰台企业网站建设深圳坪山新楼盘
  • vps网站设置全国物流信息网
  • 手机端网站怎么做wordpress目录权限设置密码
  • 东莞手机网站站定制开发宁波网站seo哪家好
  • 二级网站建设 管理思路海口企业免费建站
  • python网站开发基础个人博客首页
  • 威海哪里做网站宁波外贸公司为什么这么多
  • 广东哪家网站建实名认证域名可以做电影网站吗
  • 加强网站建设和信息公开网站里面送礼物要钱怎么做代码
  • 教你如何快速建站网站图片怎么做超链接
  • 深圳建站模板购买品牌网站开发设计
  • 珠海网站制作报价重庆制作网站怎么选
  • 本地网站建设信息大全wordpress 写文章空白
  • 济南网站建设cnwenhui莱芜网站建设sikesoft
  • 网站如何建设名称大一做家教的网站
  • 做网站选关键词网站域名可以更换吗
  • 惠东住房建设局网站发帖推广
  • 金华市建设局网站贾润根中国建设工程安全管理协会网站
  • 中山网站建设sipocms移动互联网开发技术电子书
  • 普通网站设计免备案 网站加速
  • 二手商品网站开发背景溧水114网站开发
  • 网站开发工资多少生成flash的网站源码
  • 怎么建设好一个外贸购物网站网络销售的工作内容
  • 德州网站有哪些快速提高关键词排名的软件
  • php 微信 网站建设一个网站怎么做聚合
  • 顺德网站建设收费标准参考消息网国内新闻
  • 国内企业建站模板广平手机网站建设
  • 极路由 做网站蔡甸网站建设
  • 纯静态企业网站芦苞网站建设
  • 个人网站设计方案免费申请电子邮箱