v8 的内存相关

news/2024/9/30 13:22:05

查看内存

按照《深入浅出nodejs》一书所说,64位机器可使用内存大概是1.5G. 可以通过 process.memoryUsage() 查看.

Returns an object describing the memory usage of the Node.js process measured in bytes.

图片解读

垃圾回收

v8 将内存分为2部分:

  1. 一个是新生代区(生存周期短的).
  2. 一个是老生代区(生存周期长的).

如果一个变量在新生代区经过三次垃圾回收依然存在,则移动到老生代区

新生代区内存回收用 scavenge 算法, 老生代区用 mark-sweep & mark-compact 及 Incremental Marking 算法.

  1. scavenge

将内存区间分为2部分,from & to. 遍历 from 中的对象,将还存活对象移动到 to 中。然后回收 from, 然后 to 和 from 互换.

  1. mark-sweep

标记清除法。遍历老生代区,标记所有不存活的对象,然后逐一释放他们.(会产生内存碎片)

  1. mark-compact

在 mark-sweep 的基础上,消除内存碎片。(将存活的对象移动到内存的一端)

  1. Incremental Marking

因为回收内存的时候,会 stop-the-world, 而这是致命的,会导致服务器失去响应。Incremental Marking 就是分步进行,每次清理一小段,然后让js 逻辑执行一下.

进程状态分析日志

启动node 的时候,增加 node --prof somename.js 参数. 可以得到一个日志文件。

然后启动 node --prof-process isolate-0000018C066AAC90-3356-v8.log > v8.log 可以得到一个日志文件。

isolate-0000018C066AAC90-3356-v8.log 是生成的日志文件名字.

大致如下:

Statistical profiling result from .\isolate-00000260A9D5D440-5280-v8.log, (9 ticks, 0 unaccounted, 0 excluded).[Shared libraries]:ticks  total  nonlib   name6   66.7%          D:\nodejs\node.exe3   33.3%          C:\Windows\SYSTEM32\ntdll.dll[JavaScript]:ticks  total  nonlib   name[C++]:ticks  total  nonlib   name[Summary]:ticks  total  nonlib   name0    0.0%    NaN%  JavaScript0    0.0%    NaN%  C++0    0.0%    NaN%  GC9  100.0%          Shared libraries[C++ entry points]:ticks    cpp   total   name[Bottom up (heavy) profile]:Note: percentage shows a share of a particular caller in the totalamount of its parent calls.Callers occupying less than 1.0% are not shown.ticks parent  name6   66.7%  D:\nodejs\node.exe6  100.0%    D:\nodejs\node.exe1   16.7%      LazyCompile: ~patchProcessObject node:internal/process/pre_execution:112:281  100.0%        LazyCompile: ~prepareMainThreadExecution node:internal/process/pre_execution:36:361  100.0%          Function: ~<anonymous> node:internal/main/run_main_module:1:11   16.7%      LazyCompile: ~nextTick node:internal/process/task_queues:103:181  100.0%        LazyCompile: ~onwrite node:internal/streams/writable:428:171  100.0%          LazyCompile: ~afterWriteDispatched node:internal/stream_base_commons:155:301  100.0%            LazyCompile: ~writeGeneric node:internal/stream_base_commons:147:221   16.7%      LazyCompile: ~WriteStream node:tty:84:211  100.0%        LazyCompile: ~createWritableStdioStream node:internal/bootstrap/switches/is_main_thread:45:351  100.0%          LazyCompile: ~getStdout node:internal/bootstrap/switches/is_main_thread:146:191  100.0%            LazyCompile: ~get node:internal/console/constructor:209:141   16.7%      LazyCompile: ~Module.load node:internal/modules/cjs/loader:1025:331  100.0%        LazyCompile: ~Module._load node:internal/modules/cjs/loader:807:241  100.0%          LazyCompile: ~executeUserEntryPoint node:internal/modules/run_main:74:311  100.0%            Function: ~<anonymous> node:internal/main/run_main_module:1:11   16.7%      Function: ~<anonymous> node:internal/process/esm_loader:1:11  100.0%        Function: ~<anonymous> node:internal/modules/cjs/loader:1:11  100.0%          LazyCompile: ~initializeCJSLoader node:internal/process/pre_execution:535:291  100.0%            LazyCompile: ~prepareMainThreadExecution node:internal/process/pre_execution:36:361   16.7%      Function: ~<anonymous> node:internal/modules/esm/loader:1:11  100.0%        Function: ~<anonymous> node:internal/process/esm_loader:1:11  100.0%          Function: ~<anonymous> node:internal/modules/cjs/loader:1:11  100.0%            LazyCompile: ~initializeCJSLoader node:internal/process/pre_execution:535:293   33.3%  C:\Windows\SYSTEM32\ntdll.dll1   33.3%    D:\nodejs\node.exe1  100.0%      LazyCompile: ~initializeCJSLoader node:internal/process/pre_execution:535:291  100.0%        LazyCompile: ~prepareMainThreadExecution node:internal/process/pre_execution:36:361  100.0%          Function: ~<anonymous> node:internal/main/run_main_module:1:1

第三方工具分析堆内存

linux-signal

  1. kill -l 查看所有支持的信号
  2. kill -s SIGUSR2 -- 27564 想 pid 为 27564 的进程发送一个信号
  3. kill -h 查看帮助手册.

node-heapdump

  1. 需要先安装python环境
  2. npm install heapdump
  3. 在脚本中使用 const heapdump = require("heapdump")
  4. windows中不会向进程发送信号. 转为linux 运行,发送信号 kill -s SIGUSR2 -- 27564 得到一个文件 heapdump-110146120.170500.heapsnapshot.
  5. 打开 google chrome浏览器,进入开发者模式,选择 memory, 然后在左边的空白处单击右键load 刚才生成的文件。

大致如下:

还有一个问题,如何从这里发现确实存在内存泄漏???

node-memewatch

无法安装, 已经不更新了。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66484.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

remote-ssh

远程工作(remote working)安装插件 remote-ssh 增加相应配置然后点击+号,依次按照提示添加配置,最后,如下所示(手动添加 IdentityFile "D:\key\local_test")修改秘钥文件权限,依次点击属性,安全,高级,禁用继承,然后删除所有其他的权限只留下自己的It should …

数据同步备份软件 GoodSync 12.7.5.5 绿色版 运维神器

下载地址:https://pan.quark.cn/s/c039278a61b0 介绍 GoodSync,数据同步备份软件,文件实时同步及网盘管理工具!它是一款独特同步算法的文件同步和备份软件,能实现多台电脑、电脑与云端网盘、电脑和远程FTP服务器、电脑与U盘之间的数据和文件同步转换。 软件特点实时数据传输…

(一)WPF项目结构

创建好新项目后会有者几个文件: 1.App.xaml文件存项目配置信息StartuoUri:项目不启动窗口 x:Class=“WpfTest.App” :类型编译信息 2.MainWindow.xaml主窗口

代码随想录算法训练营第六天|理解hash表

What is Hash Table?引用自文章链接:https://programmercarl.com/哈希表理论基础.html#哈希表哈希表是根据关键码的值而直接进行访问的数据结构。直白来讲其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。 哈希函数 通过hashC…

南沙C++信奥赛陈老师解一本通题1965:【14NOIP普及组】珠心算测验

​【题目描述】珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。 某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数…

Steam++工具箱 Watt Toolkit v3.0.0-rc11 中文绿色版

获取地址:https://pan.quark.cn/s/afd88fd92762 介绍 Steam++是一个包含多种 Steam 工具功能的工具箱,Steam++ 可在所有支持的 Windows 、macOS 、iOS 和 Android 版本上使用,同步令牌、账号信息。 软件截图软件特点 加速访问 该功能能够使 Steam 社区、 Github 、谷歌验证码…

opencascade TopoDS_AlertWithShape源码学习

opencascade TopoDS_AlertWithShape 前言一种特定的对象(我们称之为Alert对象),该对象在其内部字段中存储了一个TopoDS形状 方法 1 带有形状参数的构造函数 TopoDS_AlertWithShape (const TopoDS_Shape& theShape); 2 返回包含的形状 TopoDS_Shape& GetShape() ; 3…

STranslate(翻译、OCR工具) v1.2.5.927 绿色版

​STranslate(翻译、OCR工具) v1.2.5.927 绿色版下载地址:https://pan.quark.cn/s/1198dc1529f9 介绍 STranslate 是一款为 Windows 用户设计的免费开源的翻译和 OCR(光学字符识别)工具。它提供了一种高效且直观的方式来翻译和识别屏幕上的文字。该软件以「即开即用、即用即走」…