图解 Google V8
李兵
前盛大创新院高级研究员
26763 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

22|答疑:几种常见内存问题的解决策略

解决频繁垃圾回收问题的方法
导致频繁垃圾回收的原因
解决内存膨胀问题的方法
内存膨胀与内存泄漏的差异
DOM节点引起的内存泄漏
闭包引起的内存泄漏
JavaScript中内存泄漏的原因
频繁的垃圾回收
内存膨胀
内存泄漏
异步和同步读文件API的区别
Node的体系架构
思考题
几种内存问题
Node中的readFile API工作机制
参考文章

该思维导图由 AI 生成,仅供参考

你好,我是李兵。
这是我们“事件循环和垃圾回收”这个模块的最后一讲。在这个模块中,我们讲了消息循环系统和垃圾回收机制,这两块内容涉及到了比较底层的知识,但是这些知识对实际的项目有着非常重要的指导作用,很多同学也比较关注这两部分内容。
今天这节答疑课,我们来结合 Node 中的读文件操作,分析下消息循环系统是怎么影响到异步编程的,然后我们再来结合 JavaScript 中的几种常见的内存问题,来分析下内存问题出现的原因和解决方法。

Node 中的 readFile API 工作机制

Node 中很多 API 都提供了同步和异步两种形式,下面我们来看下《17 | 消息队列:V8 是怎么实现回调函数的?》这节课留的思考题。思考题中有两段代码,我们通过这两段代码来分析下同步和异步读文件 API 的区别。
var fs = require('fs')
var data = fs.readFileSync('test.js')
function fileHanlder(err, data){
data.toString()
}
fs.readFile('test.txt', fileHanlder)
在解答这个问题之前,我们来看看 Node 的体系架构。你可以先参考下图:
Node 是 V8 的宿主,它会给 V8 提供事件循环和消息队列。在 Node 中,事件循环是由 libuv 提供的,libuv 工作在主线程中,它会从消息队列中取出事件,并在主线程上执行事件。
同样,对于一些主线程上不适合处理的事件,比如消耗时间过久的网络资源下载、文件读写、设备访问等,Node 会提供很多线程来处理这些事件,我们把这些线程称为线程池。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Node中的消息循环系统对异步编程的影响以及JavaScript中的内存问题及解决方法。首先,通过分析Node中的readFile API工作机制,阐述了事件循环和消息队列的工作原理,以及同步和异步读文件API的区别。其次,详细讨论了JavaScript中的内存问题,包括内存泄漏和内存膨胀,并提出了解决方法。文章通过具体案例和技术原理,为读者提供了解决这些问题的实用策略。同时,还强调了合理规划项目和充分利用缓存等技术来减轻项目中不必要的内存占用。整体而言,本文内容丰富,涵盖了Node中的消息循环系统和JavaScript中的内存问题,对于开发者解决实际项目中的内存问题具有一定的指导意义。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《图解 Google V8》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • sugar
    介绍一个场景:Node.js v4.x ,BFF层服务端在js代码中写了一个lib模块 做lfu、lru的缓存,用于针对后端返回的数据进行缓存。把内存当缓存用的时候,由于线上qps较大的时候,缓存模块被频繁调用,造成了明显的gc stw现象,外部表现就是node对上游http返回逐渐变慢。由于当时上游是nginx,且nginx设置了timeout retry,因此这个内存gc问题当node返回时间超出nginx timeout阈值时 进而引起了nginx大量retry,迅速形成雪崩效应。后来不再使用这样的当时,改为使用node服务器端本地文件+redis/memcache的缓存方案,node做bff层时 确实不适合做内存当缓存这种事。

    作者回复: 实践出真知👍

    2020-05-06
    6
    37
  • Lorin
    运行场景:K线行情列表 技术方案,websocket 推送二进制数据(2次/秒) -> 转换为 utf-8 格式 -> 检查数据是否相同 -> 渲染到 dom 中 出现问题:页面长时间运行后出现卡顿的现象 问题分析:将二进制数据转换为 utf-8 时,频繁触发了垃圾回收机制 解决方案:后端推送采取增量推送形式

    作者回复: 很接地气的案例

    2020-05-05
    17
  • sheeeeep
    介绍一下最近遇到的内存问题,非常粗暴就是webview页面内存占用了400多M,加上app本身、系统的内存占用,1G内存的移动设备直接白屏。其中部分原因是用webaudio加载了十多个音乐文件,用canvas加载了几十张小图片。图片直接改成url用到的时候再加载到webgl中,声音文件按需加载,有了很大的缓解。

    作者回复: 很接地气的案例

    2020-05-05
    2
    11
  • 我来人间一趟
    请教老师个问题,chromium中的jscore和v8是一个东西吗 ?

    作者回复: 不是,jscore是苹果内置在webkit中的js引擎,也是很早期的了,开始chrome用了webkit,但是没用jscore,而是采用了他们自己开发的v8

    2020-05-06
    2
    3
  • 小雨点点
    在项目中遇到对地图操作旋转平移缩放导致的内存泄露问题,3个小时浏览器内存就溢出了,当把平移缩放这类代码操作注释掉又不会溢出,利用memory难定位出问题,麻烦老师能否考虑加一篇dev tools调试内存泄露问题的文章,相关文章网络上太少了。
    2020-07-27
    9
  • 子云
    我遇到过一个案例,在node项目里执行了一个2秒出发一次的定时任务,不小心在这个定时任务里一直添加监听事件了,导致内存每天泄露40多mb
    2020-06-12
    1
    2
  • 新哥
    我们的系统服务中引用了大量的node addon,C++中的一些空指针、变量没回收等很多问题造成了node vm的内存泄露,每次排查问题时很麻烦,现在有工具可以直接定位是js本身还是addon的泄露吗?
    2022-04-07
    1
    1
  • Yvan
    一直把 内存泄露( memory leak )和 内存溢出( out of memory) 混为一谈,感觉泄露这个词不够准确,应该叫内存遗漏才准确吧
    2021-11-19
    1
  • 浩然
    老师有内存监测工具的分享么
    2023-10-06归属地:北京
  • Geek_0b4d0f
    function Foo(){temp = 1} const f = new Foo(); console.log(f.temp) // undefined 按照文章的说法,v8引擎会用this.temp 替换 temp ,但实际结果看起来不是这样,请老师解除这个疑惑
    2023-04-21归属地:广东
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部