元素字体大小变化 添加或者删除可见的DOM元素 激活CSS伪类(例如::hover) 查询某些属性或调用某些方法 一些常用且会导致回流的属性和方法: clientWidth、clientHeight...这点是前端性能优化的基础,而性能优化是前端最重要的核心基础技能点,也是面试官最看中的基础之一 2.你对This了解吗,有自己实现过call,apply,bind吗?...50行javaScript代码实现call,apply,bind 这是一个很基础的技能点,考察你对闭包,函数调用的理解程度,我感觉我写得比较简单容易懂 3.如何减少重绘和回流的次数: 4.你对前端的异步编程有哪些了解呢...而标记整理是为了解决标记清除后留下的内存碎片问题。...浏览器的会话存储和持久性存储 4.浏览器缓存的实现机制的实现 10.同源策略是什么,跨域解决办法,cookie可以跨域吗? 跨域解决的办法 Q:为什么会出现跨域问题?
而实时信号是通过队列来实现,所以,假设在阻塞等待的时候,多个相同的信号到来,最终解除阻塞的时候,会传递多次信号。 信号处理器 信号处理器是指当捕获指定信号时(传递给进程)时将会调用的一个函数。...(主程序在执行某一个系统调用的时候,有可能被信号打断,当信号处理器返回时,可以通过参数控制是否重启这个系统调用)。...这个问题本质是,解除阻塞和等待信号这2步操作不是原子的,出现了竞态条件。这个竞态条件发生在主程序和信号处理器对同一个被解除信号的竞争关系。 要避免这个问题,可以通过sigsuspend调用来等待信号。...当主循环检测到这个标记时,会置ngx_noaccepting为1,表示旧的master进程下的worker进程陆续都会退出,不再对外服务了。...当我们发现新的binary有问题时,如果旧的master进程被我干掉了,我们还要使用backup的旧的binary再启动,这个切换时间一旦过长,会造成比较严重的影响,可能更糟糕的情况是你根本没有对旧的binary
我们写代码时,除了全局变量的声明,我们实际编写的逻辑,全部都是包在一个个的函数中的,比如程序是从main()函数开始执行的,而函数之间的调用,总体上是: A函数调用B函数 B函数调用D函数 D函数执行完毕返回到...要解决这个问题,最简单的做法就是在扫描阶段STW,但是STW的性能损耗太大,怎么样能做到不STW地对对象的引用关系进行扫描呢? 答案是,我们想办法破坏掉上面的两个条件就可以了。...但是因为STW要求把所有的goroutine停下来,而为了保证goroutine停下时处于一个比较安全的状态,go的垃圾收集器会观察goroutine,一般是在goroutine进行函数调用时将其暂停。...这里有个问题,就是如果有什么逻辑导致一个goroutine一直在运行没有进入想函数调用这种可以安全暂停的状态【比如你写个流程极长的循环累加什么的】就会导致其他goroutine都被停下来等待这一个没能暂停的...那如果我们把设置改为200,那就是堆内存占用达到6M时触发GC,以此类推 需要注意的是,将这个值调大并不一定是一个好的选择,确实我们允许程序占用的空间会变多,这能减少GC的频率,但也导致每次GC需要扫描和清理的内存变大
好了,到这里就可以把话语权交给面试官了。因为到这里,他接下来可以问的点有很多,你不知道他会问什么,比如: 你刚刚谈到了根节点,那你知道哪些对象可以作为根对象吗?...上面的这些问题都太常规了,任何一份面经里面都会有这样的几个问题。 而本文要解决的是下面这个稍微不那么常见,但是你答题的过程中一定会提到的点“并发标记”、“浮动垃圾”。...CMS和G1都是有一个并发标记的过程,并发标记要解决什么问题?带来了什么问题?怎么解决这些问题呢? ? 并发标记要解决什么问题?...他可能会问:你刚刚说的第二种情况,"把原本存活的对象错误的标记为已消亡"能具体的说明一下吗?怎么消亡的?垃圾回收器是怎么解决这个问题的?...有一个大佬叫Wilson,他在1994年在理论上证明了,当且仅当以下两个条件同时满足时,会产生"对象消失"的问题,原来应该是黑色的对象被误标为了白色: 条件一:赋值器插入了一条或者多条从黑色对象到白色对象的新引用
vue3.0 特性你有什么了解的吗?...,主要用来做虚拟DOM的渲染优化(优化器)第三步是 使用 element ASTs 生成 render 函数代码字符串(代码生成器)Vue 初始化页面闪动问题如何解决?...key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确、更快速diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行比对...、尾、旧尾新头、旧头新尾.准确: 如果不加key,那么vue会选择复用节点(Vue的就地更新策略),导致之前节点的状态被保留下来,会产生一系列的bug.快速: key的唯一性可以被Map数据结构充分利用...过程中调用对应的钩子4.当执行指令对应钩子函数时,调用对应指令定义的方法Vue为什么没有类似于React中shouldComponentUpdate的生命周期?
key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确、更快速diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行比对...、尾、旧尾新头、旧头新尾.准确: 如果不加key,那么vue会选择复用节点(Vue的就地更新策略),导致之前节点的状态被保留下来,会产生一系列的bug.快速: key的唯一性可以被Map数据结构充分利用...常见的配置选项有 deep 和 immediate,对应原理如下deep:深度监听对象,为对象的每一个属性创建一个 watcher,从而确保对象的每一个属性更新时都会触发传入的回调函数。...主要原因在于对象属于引用类型,单个属性的更新并不会触发对象 setter,因此引入 deep 能够很好地解决监听对象的问题。同时也会引入判断机制,确保在多个属性更新时回调函数仅触发一次,避免性能浪费。...immediate:在初始化时直接调用回调函数,可以通过在 created 阶段手动调用回调函数实现相同的效果Vue模版编译原理知道吗,能简单说一下吗?
,可以通过malloc() 和 free() 来分配和销毁这些内存,如果一段数据不再需要了,有没有主动调用 free() 函数来释放,会造成内存泄漏的问题。...= { name: 'b' }; } showName(); } test(); 有一个记录当前执行状态的指针(称为 ESP)指向调用栈中的函数执行上下文。...从图中可以很明显的看出来,如果对一块内存进行多次的标记-清除算法,就是产生大量的内存碎片,这样会导致如果有一个对象需要一块大的连续的内存出现内存不足的情况。...全停顿会带来什么问题呢?...你可能会想,什么时候会出现第一个问题呢?
1.1 V8的内存限制与对象分配 一般的后端语言基本在内存上是没什么限制的,然而node中通过JavaScript使用内存时可以发现只能使用部分内存。...但是Mark-Sweep有个问题,就是在标记清除回收后,内存空间会出现不连续的状态,这种内存碎片会对后续的内存分配造成问题,因为很可能出现分配一个大对象的情况,这时所有的碎片空间都无法完成此次分配,就会提前触发垃圾回收...想要释放掉常驻内存的对象,可以调用delete命令或者将变量重新赋值,让旧的对象脱离引用关系,接下来的老生代内存清除和整理过程中会被回收释放。 同样,在非全局作用域中也可以这么操作。...2.2 闭包 由于JavaScript的链式作用域,外部作用域是无法访问内部作用域的,而实现外部作用域可以访问内部作用域中变量的方法叫做闭包。闭包是得益于高阶函数的。...如果用数据库来记录日志就会存在问题,日志通常时海量的,而数据库是构建在文件系统之上的,写入的效率是远远低于文件直接写入的,于是会形成数据库写入操作的堆积,而JavaScript中相关的应用作用域也不会得到释放
为了解决这个问题,经过 vue 内部处理后可以使用以下几种方法来监听数组push();pop();shift();unshift();splice();sort();reverse();复制代码由于只针对了以上...对象为引用类型,当复用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改;而使用返回对象的函数,由于每次返回的都是一个新对象(Object...的实例),引用地址不同,则不会出现这个问题。...,移动到旧后之后)旧后与新前(尾与头比,此种发生了,涉及移动节点,那么新前指向的节点,移动到旧前之前)--- 问完上面这些如果都能很清楚的话,基本O了 ---以下的这些简单的概念,你肯定也是没有问题的啦...destroyed:实例销毁之后调用,调用后,Vue实例指示的所有东西都会解绑,所有事件监听器和所有子实例都会被移除每个生命周期内部可以做什么?
,竞态问题可能会展示旧类型数据,或重复展现多个状态的数据; 3、下拉刷新: 在加载分页数据的同时下拉刷新,竞态问题可能会导致刷新后展示旧的分页数据,而不是最新的数据。...,与状态无关或与调用顺序无关的场景说明能够容忍混乱的结果,不考虑竞态问题(例如,页面分步加载时,哪个请求先返回都可以,不存在竞争); 必要条件 3 - 响应不稳定: 当请求的响应时延不稳定才可能出现竞争...提供了打标记的 API,那么我们可以给同位竞争的请求都打上相同的 TAG 标记,在每次发起请求时先批量取消所有相同 TAG 的请求,这样就不需要维护旧请求的 Call 对象了。...后面了解到方法 2 之后,就没必要走这个思路了。相比之下,自定义拦截器会更灵活,将来有特殊的需求可以考虑往这个思路上靠。...小彭之前还不知道 Retrofit @TAG 这个注解,所以在使用 Retrofit 时都是采用 方法 1 维护旧 Call 对象的方式来取消请求,也算有所收获。关注我,我们下次见。
在回调中你可以使用箭头函数,但问题是每次组件渲染时都会创建一个新的回调。...Element 的函数,而 cloneElement 则是用于复制某个元素并传入新的 Props在 ReactNative中,如何解决8081端口号被占用而提示无法访问的问题?...source参数时,默认在每次 render 时都会优先调用上次保存的回调中返回的函数,后再重新调用回调;useEffect(() => { // 组件挂载后执行事件绑定 console.log...;引用传递 : 如果需要传递元组件的 refs 引用,可以使用React.forwardRef;静态方法 : 元组件上的静态方法并无法被自动传出,会导致业务层无法调用;解决:函数导出静态方法赋值重新渲染...图片这就意味着,如果 dom 节点发生了跨层级移动,react 会删除旧的节点,生成新的节点,而不会复用。
我们可以判断key是否为当前被代理对象target自身属性,也可以判断旧值与新值是否相等,只有满足以上两个条件之一时,才有可能执行trigger。...使用Watch的深度监听可能会带来性能问题,优化的话可以使用字符串形式监听,如果没有写到组件中,也就是使用vm.watch来设置监听的时候,这个vm.watch是会返回一个取消观察函数,调用这个函数就可以手动注销监听了...本来也不难就当一个装逼的知识点吧 12. 组件中的data为什么是一个函数? 这个问题 确实问的我错不及防 ,但是这还是个事吗? 一个组件被复用多次的话,也就会创建多个实例。...如果新的一方有子节点,旧的一方没有,相当于新的子节点替代了原来没有的节点;同理,如果新的一方没有子节点,旧的一方有,相当于要把老的节点删除。 • 再来比较都有子节点的情况,这里是diff的核心。...虚拟Dom以及key属性的作用 这个问题在 某友 面试时问的 , 记忆犹新,面试官非说我错了 ,不上辩解的我只能屈服 由于在浏览器中操作DOM是很昂贵的。频繁的操作DOM,会产生一定的性能问题。
什么样的程序会长时间执行呢? 最明显的特征就是指令序列的复用,如方法调用、循环跳转、异常跳转等,只有具备这些功能的指令才会产生安全点。...虚拟机发起垃圾收集时,不必理会已声明在安全区域的线程;而当线程离开安全区域时,会检查虚拟机是否已经完成根节点枚举(或者其他暂停用户线程的阶段): 若完成,则继续执行; 否则就必须等待,直至收到可以离开安全区域的信号...5.1 伪共享问题 5.1.1 伪共享 除了写屏障的开销,高并发场景下还存在“伪共享(False Sharing)”问题:即,多线程修改互相独立的变量时,如果这些变量恰好共享一个缓存行,会彼此影响而导致性能降低...程序会因此报错,这是个严重的问题。 6.3 如何解决对象消失 如何解决上述“对象消失”的问题呢?...做法:黑色对象(A)插入新的指向白色对象(C)的引用关系(A→C)时,就将这个新插入的引用记录下来,待并发扫描结束之后,再以这些记录过的引用关系中的黑色为根,重新扫描一次。
第二个参数是一个数组,传入内部的执行副作用函数需要的依赖,当这几个依赖有一个要更新,effect里面也会重新生成一个新的副作用并执行副作用。如果没有更新,则不会执行。...如果要区分生命周期,不传第二个参数,每次都会跑,相当于didupdate。...加个mount标记一下,里面用if判断一下,即可以达到模拟生命周期的效果" 很多人都会想到这个办法模拟,于是我们试一下看看: let mount; function useForceUpdate()...这样子,我们拆成两个useEffect调用,就可以解决问题: function UnmountTest() { useEffect(() => { if (mount) {...有问题,很自然想到异步,说到异步又想到了requestIdleCallback,这个函数就是浏览器空闲的时候执行callback。
如此庞大的空间要在每次垃圾回收时肯定是不能遍历整个引用链的,就好比系统用户量百万以上级别的,用户列表还能每次从硬盘读取吗?我们当然不会这么做。为了解决这一问题最早是用保守式GC和后来的准确式GC。...在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了。OopMap就是一个附加的信息,告诉你栈上哪个位置本来是个什么东西。这个信息是在JIT编译时跟机器码一起产生的。...就是持续执行下去的意思,例如方法的调用、循环、异常跳转等这些节点上。...安全点上有OopMap,是有利于垃圾回收所用的信息,所以,在发生GC时就要尽量让所有用户线程跑到离安全点更近的地方停下来,这里有两种方法:抢先式中断和主动式中断。...,HotSpot从对象生成的那一刻、到开始内存回收、如何快速准确的回收而做了很多工作,在实现上,从GC Roots的快速扫描、记忆集、卡表、又用卡页中元素维护堆中包含跨代引用的对象以及三色标记和解决并发标记带来的问题
需要注意的是 ViewModel 所封装出来的数据模型包括视图的状态和行为两部分,而 Model 层的数据模型是只包含状态的,比如页面的这一块展示什么,而页面加载进来时发生什么,点击这一块发生什么,这一块滚动时发生什么这些都属于视图行为...用任何方式生成的数据,如果接收的变量是一个proxy代理对象,就都会导致watch这个对象时,watch回调里无法正确获取旧值。...这些被标记的节点(静态节点)我们就可以跳过对它们的比对,对运行时的模板起到很大的优化作用。编译的最后一步是将优化后的AST树转换为可执行的代码。子组件可以直接改变父组件的数据吗?...属性有一个get方法和一个set方法,当数据发生变化时,会调用set方法。...这个可以是这个节点的唯一标识,告诉diff 算法,在更改前后它们是同一个DOM节点扩展v-for 为什么要有key ,没有key 会暴力复用,举例子的话随便说一个比如移动节点或者增加节点(修改DOM),
这段代码有什么问题吗?...雪球效应,虽然我一个组件还是使用着同一个 mixin,但是一个 mixin 会被多个组件使用,可能会存在需求使得 mixin 修改原本的函数或者新增更多的函数,这样可能就会产生一个维护成本HOC 解决了这些问题...一旦有了这个DOM树,为了弄清DOM是如何响应新的状态而改变的, React会将这个新树与上一个虚拟DOM树比较。...子组件render的执行会影响性能,这时就可以使用shouldComponentUpdate来解决这个问题。...面对这个问题,可以使用如下方法进行解决:(1)使用setState改变数据之前,先采用ES6中assgin进行拷贝,但是assgin只深拷贝的数据的第一层,所以说不是最完美的解决办法:const o2
React组件的构造函数有什么作用?它是必须的吗?...在回调中你可以使用箭头函数,但问题是每次组件渲染时都会创建一个新的回调。什么原因会促使你脱离 create-react-app 的依赖当你想去配置 webpack 或 babel presets。...图片这就意味着,如果 dom 节点发生了跨层级移动,react 会删除旧的节点,生成新的节点,而不会复用。...,减少节点的创建和删除操作render函数中减少类似onClick={() => {doSomething()}}的写法,每次调用render函数时均会创建一个新的函数,即使内容没有发生任何变化,也会导致节点没必要的重渲染...为了解决这个问题,Hook 将组件中相互关联的部分拆分成更小的函数(比如设置订阅或请求数据),而并非强制按照生命周期划分。你还可以使用 reducer 来管理组件的内部状态,使其更加可预测。
这个问题的前置条件是你得知道 GC 分代,为什么分代。这个在之前文章提了,不清楚的可以去看看。 现在我们来回答一下这个问题。...还有 Minor GC,其指的就是年轻代的 gc。 young gc 触发条件是什么? 大致上可以认为在年轻代的 eden 快要被占满的时候会触发 young gc。 为什么要说大致上呢?...那 PLAB 知道吗? 可以看到和 TLAB 很像,PLAB 即 Promotion Local Allocation Buffers。 用在年轻代对象晋升到老年代时。...这个方法中被调用的。...卡表其实只有一份,又得用来支持 YGC 又得支持 CMS 并发时的增量更新肯定是不够的。 每次 YGC 都会扫描重置卡表,这样增量更新的记录就被清理了。
领取专属 10元无门槛券
手把手带您无忧上云