最后
javascript是前端必要掌握的真正算得上是编程语言的语言,学会灵活运用javascript,将对以后学习工作有非常大的帮助。掌握它最重要的首先是学习好基础知识,而后通过不断的实战来提升我们的编程技巧和逻辑思维。这一块学习是持续的,直到我们真正掌握它并且能够灵活运用它。如果最开始学习一两遍之后,发现暂时没有提升的空间,我们可以暂时放一放。继续下面的学习,javascript贯穿我们前端工作中,在之后的学习实现里也会遇到和锻炼到。真正学习起来并不难理解,关键是灵活运用。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
一、前言
G1(Garbage First
)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7
就已加入JVM
的收集器大家庭中,成为HotSpot
重点发展的垃圾回收技术。同优秀的CMS垃圾回收器一样,G1
也是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。G1最大的特点是引入分区的思路,弱化了分代的概念,合理利用垃圾收集各个周期的资源,解决了其他收集器甚至CMS的众多缺陷。
在前两篇博文《JVM进阶(九):年轻代收集器》、《JVM进阶(十):年老代收集器》中讲解了新生代和年老代的收集器,在本篇博文中介绍一个收集范围涵盖整个堆的收集器:G1收集器。
先讲讲G1收集器的特点,G1收集器也是个多线程的收集器,能够充分利用多个CPU
进行工作,收集方式也与CMS收集器类似,因此不会有太久的停顿。
虽然回收的范围是整个堆,但还是有分代回收的回收方式。在年轻代依然采用复制算法;年老代也同样采用“标记-清除-整理”算法。但是,新生代与老年代在堆内存中的布局就和以往的收集器有着很大的区别:G1将整个堆分成了一个个大小相等的独立区域,叫做region
。其中依然保存着新生代和年老代的概念,如下图:
是不是和之前博文中看到的不同(这是内存空间图,不要和垃圾回收图弄混了),以往只是简单的分区域,而这里是将整个堆分成多个大小相等的区域。
他的回收过程也分为四个部分:初始标记、并发标记、最终标记、筛选回收。
大家是不是觉得很熟悉!上面我们也说过了,和CMS收集器类似,初始标记需要STW
;并发标记不需要;最终标记就是做一些小修改,需要STW
;而筛选回收则有些不同,在众多的region
中,每个region
可回收的空间各不相同,但是回收所消耗的时间是需要控制的,不能太长,因此G1
就会筛选出一些可回收空间比较大的region
进行回收,这就是G1的优先回收机制。这也是保证了G1收集器能在有限的时间内能够获得最高回收效率的原因。通过-XX:MaxGCPauseMills=50
毫秒设置有限的收集时间。
每个region
之间的对象引用通过remembered set
来维护,每个region
都有一个remembered set
,remembered set
中包含了引用当前region
中对象的指针。虚拟机正是通过这个remembered set
去避免对整个堆进行扫描来确认可回收的对象。
事实上,G1收集器与串行收集器、并行收集器、并发标记清除收集器这三组收集器有很大不同:
- G1的设计原则是"首先收集尽可能多的垃圾(
Garbage First
)"。因此,G1并不会等内存耗尽(串行、并行)或者快耗尽(CMS)的时候开始垃圾收集,而是在内部采用了启发式算法,在老年代找出具有高收集收益的分区进行收集。同时G1可以根据用户设置的暂停时间目标自动调整年轻代和总堆大小,暂停目标越短年轻代空间越小、总空间就越大;
最后
如果你已经下定决心要转行做编程行业,在最开始的时候就要对自己的学习有一个基本的规划,还要对这个行业的技术需求有一个基本的了解。有一个已就业为目的的学习目标,然后为之努力,坚持到底。如果你有幸看到这篇文章,希望对你有所帮助,祝你转行成功。
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
csdnimg.cn/img_convert/54a6b04f29167333b139d2753f60db9f.png)