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

网站建设微信运营公司与众不同的网站

网站建设微信运营公司,与众不同的网站,聊城网站优化信息,萨wordpress转载自 jvm系列(三):GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”#xff0c;它诞生于1960年 MIT 的 Lisp 语言#xff0c;经过半个多世纪#xff0c;目前已经十分成熟了。 jvm 中#xff0c;程序计数器、虚拟机栈、本地方法栈都是随线程而生随线…转载自 jvm系列(三):GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”它诞生于1960年 MIT 的 Lisp 语言经过半个多世纪目前已经十分成熟了。 jvm 中程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭栈帧随着方法的进入和退出做入栈和出栈操作实现了自动的内存清理因此我们的内存垃圾回收主要集中于 java 堆和方法区中在程序运行期间这部分内存的分配和使用都是动态的. 对象存活判断 判断对象是否存活一般有两种方式 引用计数每个对象有一个引用计数属性新增一个引用时计数加1引用释放时计数减1计数为0时可以回收。此方法简单无法解决对象相互循环引用的问题。可达性分析Reachability Analysis从GC Roots开始向下搜索搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时则证明此对象是不可用的。不可达对象。 在Java语言中GC Roots包括 虚拟机栈中引用的对象。方法区中类静态属性实体引用的对象。方法区中常量引用的对象。本地方法栈中JNI引用的对象。 垃圾收集算法 标记 -清除算法 “标记-清除”Mark-Sweep算法如它的名字一样算法分为“标记”和“清除”两个阶段首先标记出所有需要回收的对象在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。 它的主要缺点有两个一个是效率问题标记和清除过程的效率都不高另外一个是空间问题标记清除之后会产生大量不连续的内存碎片空间碎片太多可能会导致当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。复制算法 “复制”Copying的收集算法它将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。 这样使得每次都是对其中的一块进行内存回收内存分配时也就不用考虑内存碎片等复杂情况只要移动堆顶指针按顺序分配内存即可实现简单运行高效。只是这种算法的代价是将内存缩小为原来的一半持续复制长生存期的对象则导致效率降低。标记-压缩算法 复制收集算法在对象存活率较高时就要执行较多的复制操作效率将会变低。更关键的是如果不想浪费50%的空间就需要有额外的空间进行分配担保以应对被使用的内存中所有对象都100%存活的极端情况所以在老年代一般不能直接选用这种算法。 根据老年代的特点有人提出了另外一种“标记-整理”Mark-Compact算法标记过程仍然与“标记-清除”算法一样但后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存分代收集算法 GC分代的基本假设绝大部分对象的生命周期都非常短暂存活时间短。 “分代收集”Generational Collection算法把Java堆分为新生代和老年代这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中每次垃圾收集时都发现有大批对象死去只有少量存活那就选用复制算法只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保就必须使用“标记-清理”或“标记-整理”算法来进行回收。 垃圾收集器 如果说收集算法是内存回收的方法论垃圾收集器就是内存回收的具体实现Serial收集器 串行收集器是最古老最稳定以及效率高的收集器可能会产生较长的停顿只使用一个线程去回收。新生代、老年代使用串行回收新生代复制算法、老年代标记-压缩垃圾收集的过程中会Stop The World服务暂停 参数控制 -XX:UseSerialGC 串行收集器ParNew收集器 ParNew收集器其实就是Serial收集器的多线程版本。新生代并行老年代串行新生代复制算法、老年代标记-压缩 参数控制 -XX:UseParNewGC ParNew收集器-XX:ParallelGCThreads 限制线程数量Parallel收集器 Parallel Scavenge收集器类似ParNew收集器Parallel收集器更关注系统的吞吐量。可以通过参数来打开自适应调节策略虚拟机会根据当前系统的运行情况收集性能监控信息动态调整这些参数以提供最合适的停顿时间或最大的吞吐量也可以通过参数控制GC的时间不大于多少毫秒或者比例新生代复制算法、老年代标记-压缩 参数控制 -XX:UseParallelGC 使用Parallel收集器 老年代串行 Parallel Old 收集器 Parallel Old是Parallel Scavenge收集器的老年代版本使用多线程和“标记整理”算法。这个收集器是在JDK 1.6中才开始提供 参数控制 -XX:UseParallelOldGC 使用Parallel收集器 老年代并行 CMS收集器 CMSConcurrent Mark Sweep收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上这类应用尤其重视服务的响应速度希望系统停顿时间最短以给用户带来较好的体验。 从名字包含“Mark Sweep”上就可以看出CMS收集器是基于“标记-清除”算法实现的它的运作过程相对于前面几种收集器来说要更复杂一些整个过程分为4个步骤包括 初始标记CMS initial mark并发标记CMS concurrent mark重新标记CMS remark并发清除CMS concurrent sweep 其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象速度很快并发标记阶段就是进行GC Roots Tracing的过程而重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录这个阶段的停顿时间一般会比初始标记阶段稍长一些但远比并发标记的时间短。 由于整个过程中耗时最长的并发标记和并发清除过程中收集器线程都可以与用户线程一起工作所以总体上来说CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收集器新生代使用ParNew 优点: 并发收集、低停顿缺点: 产生大量空间碎片、并发阶段会降低吞吐量 参数控制 -XX:UseConcMarkSweepGC 使用CMS收集器-XX: UseCMSCompactAtFullCollection Full GC后进行一次碎片整理整理过程是独占的会引起停顿时间变长-XX:CMSFullGCsBeforeCompaction 设置进行几次Full GC后进行一次碎片整理-XX:ParallelCMSThreads 设定CMS的线程数量一般情况约等于可用CPU数量G1收集器 G1是目前技术发展的最前沿成果之一HotSpot开发团队赋予它的使命是未来可以替换掉JDK1.5中发布的CMS收集器。与CMS收集器相比G1收集器有以下特点 空间整合G1收集器采用标记整理算法不会产生内存空间碎片。分配大对象时不会因为无法找到连续空间而提前触发下一次GC。可预测停顿这是G1的另一大优势降低停顿时间是G1和CMS的共同关注点但G1除了追求低停顿外还能建立可预测的停顿时间模型能让使用者明确指定在一个长度为N毫秒的时间片段内消耗在垃圾收集上的时间不得超过N毫秒这几乎已经是实时JavaRTSJ的垃圾收集器的特征了。 上面提到的垃圾收集器收集的范围都是整个新生代或者老年代而G1不再是这样。使用G1收集器时Java堆的内存布局与其他收集器有很大差别它将整个Java堆划分为多个大小相等的独立区域Region虽然还保留有新生代和老年代的概念但新生代和老年代不再是物理隔阂了它们都是一部分可以不连续Region的集合。G1的新生代收集跟ParNew类似当新生代占用达到一定比例的时候开始出发收集。和CMS类似G1收集器收集老年代对象会有短暂停顿。 收集步骤 1、标记阶段首先初始标记(Initial-Mark),这个阶段是停顿的(Stop the World Event)并且会触发一次普通Mintor GC。对应GC log:GC pause (young) (inital-mark) 2、Root Region Scanning程序运行过程中会回收survivor区(存活到老年代)这一过程必须在young GC之前完成。 3、Concurrent Marking在整个堆中进行并发标记(和应用程序并发执行)此过程可能被young GC中断。在并发标记阶段若发现区域对象中的所有对象都是垃圾那个这个区域会被立即回收(图中打X)。同时并发标记过程中会计算每个区域的对象活性(区域中存活对象的比例)。4、Remark, 再标记会有短暂停顿(STW)。再标记阶段是用来收集 并发标记阶段 产生新的垃圾(并发阶段和应用程序一同运行)G1中采用了比CMS更快的初始快照算法:snapshot-at-the-beginning (SATB)。 5、Copy/Clean up多线程清除失活对象会有STW。G1将回收区域的存活对象拷贝到新区域清除Remember Sets并发清空回收区域并把它返回到空闲区域链表中。6、复制/清除过程后。回收区域的活性对象已经被集中回收到深蓝色和深绿色区域。常用的收集器组合 新生代GC策略老年老代GC策略说明组合1SerialSerial OldSerial和Serial Old都是单线程进行GC特点就是GC时暂停所有应用线程。组合2SerialCMSSerial OldCMSConcurrent Mark Sweep是并发GC实现GC线程和应用线程并发工作不需要暂停所有应用线程。另外当CMS进行GC失败时会自动使用Serial Old策略进行GC。组合3ParNewCMS使用 -XX:UseParNewGC选项来开启。ParNew是Serial的并行版本可以指定GC线程数默认GC线程数为CPU的数量。可以使用-XX:ParallelGCThreads选项指定GC的线程数。如果指定了选项 -XX:UseConcMarkSweepGC选项则新生代默认使用ParNew GC策略。组合4ParNewSerial Old使用 -XX:UseParNewGC选项来开启。新生代使用ParNew GC策略年老代默认使用Serial Old GC策略。组合5Parallel ScavengeSerial OldParallel Scavenge策略主要是关注一个可控的吞吐量应用程序运行时间 / (应用程序运行时间 GC时间)可见这会使得CPU的利用率尽可能的高适用于后台持久运行的应用程序而不适用于交互较多的应用程序。组合6Parallel ScavengeParallel OldParallel Old是Serial Old的并行版本组合7G1GCG1GC-XX:UnlockExperimentalVMOptions -XX:UseG1GC #开启 -XX:MaxGCPauseMillis50 #暂停时间目标 -XX:GCPauseIntervalMillis200 #暂停间隔目标 -XX:G1YoungGenSize512m #年轻代大小 -XX:SurvivorRatio6 #幸存区比例
http://www.pierceye.com/news/816481/

相关文章:

  • 企业网站建设费用属管理费用吗重庆网站建设制作设计公司哪家好
  • 深圳营销型网站需要多少钱做网站个体户经营范围
  • php 手机网站 上传图片晋州做网站的联系电话
  • 云天下网站建设做抖音seo排名软件是否合法
  • 网站开发合同管辖权异议龙岩网上办事大厅官网
  • 建网站费用明细海口建设网站
  • 网站页面设计说明怎么写影视小程序源码
  • 传媒网站制作网站申请建设
  • 前端做项目的网站新密市城乡建设局网站
  • 网站app建设方案智能外呼系统
  • 创建网站免费注册wordpress 熊掌号代码
  • 的广州建网站的公司黄山市网站建设
  • 做网站外包需要提供什么登录百度账号
  • 网站备案要买备案号西安鑫瀚通网站建设
  • 做网站的公司违约怎么处理免费免费网站模板
  • 动漫网站建设方案项目书目录做网站站长先把作息和身体搞好
  • 网站建设说明书网页制作成品图加代码
  • 中国网站设计师联盟福州网站大全
  • 香奈儿网站建设竞价培训
  • 毕业设计做网站的步骤电脑培训学校在哪里
  • 怎样在网站图片上做店铺广告公司名logo设计图片
  • 做ic什么网站好攀枝花三线建设网站
  • 台州市网站建设东莞网站策划
  • 网站建设响应技术wordpress502
  • 开个捕鱼网站怎么做网络销售面试问题有哪些
  • 外国纪录片网站机场建设海外seo是什么
  • 一个服务器做多个网站微信商城和网站建设
  • 网站的基本类型地推平台
  • 简单的企业小网站网页统计代码大全
  • 中国手机网站建设公司大气网站建设