javascript忍者秘籍2-----------基础

基础+函数+对象+集合+js单线程执行模型+js在服务器端运行-------------------------js的学习要点

基础

函数: 函数回调+闭包+作用域+生成器generator函数+promise,,,,,js是一门函数式语言,可怕

对象: 基于原型的面向对象(java是基于类的面向对象)

集合: 数组+map+set

基础

(一)首先,我们了解一下,js做什么?

js可以做android应用(我以前的面比较窄,我以为android应用只能用java做)

js还可以运行在浏览器端

js还可以做后台开发,运行在服务器端,

总结:js可以开发运行在网页上(l雷),桌面应用,移动应用上(雷),和服务器端的应用(me))

(二)js怎么工作的?

任何一门语言,无论运行在什么平台,其必有其解释器或者编译器,js作为一种解释性语言,其解释器叫引擎,这个引擎还是一种单线程模型,同一时刻只能执行一个代码段,那js在服务端怎么处理并发的?而且我们还知道,任何一种语言的新特性,其本质是对该语言的解释器或者编译器进行了更改,使其支持新特性,因此有的时候,即使我们的某个语言出了新特性,也会存在不支持的症状,这个时候是时候考虑更新一下你的解释器或者编译器了,,,,,,,,,,

(三)如何解决具有新特性的js不能被古老的浏览器执行?

使用转换编译器(转换器+编译器)

将js代码转换为旧版的js,使其能在古老的浏览器运行,,,,不过这个对于服务端开发人员影响不大,因为我们直接面对的服务器

(四)js应用那么广,我学啥?

使用node.js开发服务器端应用。。。。。。。。。。。。。。。。。。(之前我是搞java的,无奈呀,工作需要,不过我不会丢掉java滴,,,)

学习node,js的架构--核心就是js,,,,js的io+事件+计时器

(五)web应用的生命周期步骤?

因为要学习node.js做服务端开发,因此我们先回顾web应用的生命周期。。

小问题:

web应用一次能处理多少个事件?(1)

为什么浏览器使用事件队列来处理事件?

一个web应用一次 能处理多少request请求?请求池?

web应用生命周期:

参与者:用户+浏览器+服务器

用户输入url------------》浏览器生成请求并将请求发送至服务器-----------》服务器执行某些动作或者获取某些资源并将响应返回给客户端------------------》页面构建:浏览器处理html、css和js并构建结果页面----------》事件处理:浏览器监控事件队列,一次处理其中的一个事件--------------》关闭web页面

关键词:页面构建+事件处理(js的核心--单线程)

1)浏览器的动作-------页面构建过程:

解析html并构建dom--------》执行js代码

2)浏览器的动作-------事件处理过程:

js的引擎,也就是js的解释器,这个解释器嗯有点。。。相比于java,他只能同一时刻只能执行一个代码片段,单线程执行模型

(六)js是怎么运行的?

知道js是一门解释性语言,因此使用解释引擎v8封装了node.js平台,那么js是怎么运行的,作为解释性语言,他利用v8引擎先进性解释,解释之后的js语言在v8虚拟机上运行,而v8虚拟机本身就是只支持单线程的执行模型,这机会很尴尬,v8

虚拟机只能为js做那么多,

关键词:单线程+事件轮询+并发执行+非阻塞io-----------node.js

(七)v8虚拟机?

Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 —— Node.js是单线程的。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。

虽然v8虚拟机是单线程的执行模型,对于单cpu的机器,其同其cpu,对任务进行并行执行(轮训执行),但是对于多cpu的机器,node。js的虚拟机v8显然不能利用多cpu的有点并发执行多任务,因此这也是v8虚拟机的一个缺点,

Node.js是一个可以快速构建网络服务及应用的平台,该平台的构建是基于Chrome's JavaScript runtime,也就是说,实际上它是对GoogleV8引擎(应用于Google Chrome浏览器)进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。

(八)Node一向是这样来标榜自己的:“在node中除了代码,所有一切都是并行执行的”。?

Node一向是这样来标榜自己的:“在node中除了代码,所有一切都是并行执行的”。这句话的意思是说,Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 。Node.js是单线程的,它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 ,尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。

(九)v8虚拟机的gc机制

还记得java吧,他的gc机制在cpu空闲或者内存紧缺的时候会执行,那v8虚拟机的这个gc机制是?

怎么样?我说我最近在写 js的代码的时候从来都没有要求我用代码释放对象,原来v8虚拟机有自己的垃圾回收线程,类似java

V8的垃圾回收机制与内存限制Javascript和Java类似,由垃圾回收机制来进行自动内存管理,而Node是构建在V8虚拟机基础上,所以其内存回收和V8运行机制息息相关。V8的内存限制:64位系统约为1.4GB、32位系统约为0.7GBprocess.memoryUsage(),返回值包括heapTotal代表已申请到的堆内存,heapUsed当前使用的内存,rss(residents

(十)v8虚拟机的垃圾回收机制采用什么算法?

浅谈GC
每当我们声明一个对象,V8就会在堆内开辟一块内存用来存储这个对象,各种GC算法向来不是写一次就能适用于各种情形,各个对象的生存周期长短不一,于是把在堆上的各个对象划分为新生代和老生代。因此,V8上的堆看上去大概是这样的。

è¿éåå¾çæè¿°

认识GC算法
scavenge算法
有一种算法称之为cheney算法,这种算法的核心是将堆划分为两部分,称之为semispace。 

è¿éåå¾çæè¿°
两个semispace用于进行复制清除两项操作,把其中一个活动的semispace称之为from semispace,另一个称之为to semispace,在进行GC时,会遍历from semispace中的对象,然后把存活的对象复制到to semispace中,然后清空from semispace, 最后把from 和 to调换。

这种算法在V8中又被称之为scavenge算法,这种算法很明显的特点是,牺牲空间来提高运行效率,因此它的优点是执行时间短,而空间利用效率不高,比较适用于体积普遍较小,生存周期不长的新生代。

è¿éåå¾çæè¿°

而我们执行scavenge算法的时候,需要复制对象时,如果对象经历了多次复制,即生存周期长,V8会把它移动到老生代来,或者如果To semispace 的空间占用比超过了25% ,则也会把它移动到老生代,这是因为,之后的操作会清空from semispace 并把to semispace当作from semispace来对待,因此,占用比过高不利于后续的对象内存分配。而我们把对象从新生代移动到老生代的这个过程叫做晋升。

mark-sweep 算法
这是一种很普遍的算法,JVM也采用了这种算法。所谓mark-sweep 即标记-清除算法,从字面意思不难看出,该算法是遍历当前堆内的所有对象,然后把死亡的对象进行标记,然后进行一次清理。这样做的坏处在于,遍历整个堆是很耗费时间的,相对于scavenge算法而言,scavenge算法只遍历了半个堆,相对而言时间消耗较短,而mark-sweep算法则是遍历整个堆,相对而言时间消耗较长。除此之外,还有个缺点是那些被清除的对象使得原本完整的堆变成了破碎的堆碎片。如图所示经过一次mark-sweep清理的堆。

è¿éåå¾çæè¿°

在图中,深色部分为清理后留下的空洞,这样的可怕之处在于,下一次为一个大对象分配空间时,由于堆碎片的不连续,无法分配给这个大对象空间,因此会提前触发GC,而这次GC是不必要的。 
而为了弥补这种算法所再来的问题,mark-compact 算法被提出,它的作用主要在于将存活的对象向一个方向移动,把不连续的堆碎片变完整。 

è¿éåå¾çæè¿°
深色部分为GC留下的内存空洞,下一步我们只需把右边的给清除掉即可。

总体看来mark-sweep算法需要配合mark-compact算法才能很好的进行GC,整个过程花费的时间较scavenge算法来说较长,但空间利用率却比scavenge大,因此这种算法更适用于不需要频繁GC的老年代。

为了确保js的正常执行,gc和js执行不能并行执行,因此选择了类似于共享CPU时间片的执行方式,将gc 和js交替执行

è¿éåå¾çæè¿°

之前我也考虑过一个问题,就是v8他是单线程的执行模型,那么也就是说他的垃圾回收线程和业务的js代码又是?恍然大悟,既然只能利用一个cpu,那就线程轮训呗,

所以v8虚拟机是这样工作的,有两个线程一个是gc线程,另外一个是业务线程,gc线程和业务线程在一个cpu上轮训执行,而业务线程内部采用的是事件轮询机制进行并发操作(线程单线程,io异步)

(十一)v8虚拟机----事件处理,事件轮询

事件处理是整个web应用的核心

v8虚拟机是单线程执行模型,无论真是机器有多少个物理cpu,v8虚拟机在设计的时候只能使用一个cpu,而且是单线程的执行模型,v8虚拟机一般有两个线程,一个是js线程,另一个是gc线程,二者在一台机器的一个cpu上轮训执行,而js线程内部使用事件轮训操作,所以对事件以及事件的处理,事件的轮训是对node.js理解的关键

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值