首页 > 系统相关 >v8 的内存相关

v8 的内存相关

时间:2024-09-30 13:11:48浏览次数:1  
标签:node LazyCompile process internal 内存 v8 相关 100.0%

查看内存

按照《深入浅出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   name
      6   66.7%          D:\nodejs\node.exe
      3   33.3%          C:\Windows\SYSTEM32\ntdll.dll

 [JavaScript]:
   ticks  total  nonlib   name

 [C++]:
   ticks  total  nonlib   name

 [Summary]:
   ticks  total  nonlib   name
      0    0.0%    NaN%  JavaScript
      0    0.0%    NaN%  C++
      0    0.0%    NaN%  GC
      9  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 total
  amount of its parent calls.
  Callers occupying less than 1.0% are not shown.

   ticks parent  name
      6   66.7%  D:\nodejs\node.exe
      6  100.0%    D:\nodejs\node.exe
      1   16.7%      LazyCompile: ~patchProcessObject node:internal/process/pre_execution:112:28
      1  100.0%        LazyCompile: ~prepareMainThreadExecution node:internal/process/pre_execution:36:36
      1  100.0%          Function: ~<anonymous> node:internal/main/run_main_module:1:1
      1   16.7%      LazyCompile: ~nextTick node:internal/process/task_queues:103:18
      1  100.0%        LazyCompile: ~onwrite node:internal/streams/writable:428:17
      1  100.0%          LazyCompile: ~afterWriteDispatched node:internal/stream_base_commons:155:30
      1  100.0%            LazyCompile: ~writeGeneric node:internal/stream_base_commons:147:22
      1   16.7%      LazyCompile: ~WriteStream node:tty:84:21
      1  100.0%        LazyCompile: ~createWritableStdioStream node:internal/bootstrap/switches/is_main_thread:45:35
      1  100.0%          LazyCompile: ~getStdout node:internal/bootstrap/switches/is_main_thread:146:19
      1  100.0%            LazyCompile: ~get node:internal/console/constructor:209:14
      1   16.7%      LazyCompile: ~Module.load node:internal/modules/cjs/loader:1025:33
      1  100.0%        LazyCompile: ~Module._load node:internal/modules/cjs/loader:807:24
      1  100.0%          LazyCompile: ~executeUserEntryPoint node:internal/modules/run_main:74:31
      1  100.0%            Function: ~<anonymous> node:internal/main/run_main_module:1:1
      1   16.7%      Function: ~<anonymous> node:internal/process/esm_loader:1:1
      1  100.0%        Function: ~<anonymous> node:internal/modules/cjs/loader:1:1
      1  100.0%          LazyCompile: ~initializeCJSLoader node:internal/process/pre_execution:535:29
      1  100.0%            LazyCompile: ~prepareMainThreadExecution node:internal/process/pre_execution:36:36
      1   16.7%      Function: ~<anonymous> node:internal/modules/esm/loader:1:1
      1  100.0%        Function: ~<anonymous> node:internal/process/esm_loader:1:1
      1  100.0%          Function: ~<anonymous> node:internal/modules/cjs/loader:1:1
      1  100.0%            LazyCompile: ~initializeCJSLoader node:internal/process/pre_execution:535:29

      3   33.3%  C:\Windows\SYSTEM32\ntdll.dll
      1   33.3%    D:\nodejs\node.exe
      1  100.0%      LazyCompile: ~initializeCJSLoader node:internal/process/pre_execution:535:29
      1  100.0%        LazyCompile: ~prepareMainThreadExecution node:internal/process/pre_execution:36:36
      1  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

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

标签:node,LazyCompile,process,internal,内存,v8,相关,100.0%
From: https://www.cnblogs.com/yinchaows/p/18214456

相关文章

  • 【春秋招必看】Unity相关笔试面试题(内有完整答案)第八期
    欢迎来到光光的奇妙冒险,我是你们的煎饼光子老师。今天是我们的第八期笔试面试题总结。C#部分:1、如果我们想为Unity中的Transform类添加一个自定义的方法,应该如何处理?答案:通过C#的拓展方法相关知识点进行添加2、请说出using关键字的两个作用答案:1.引入命名空间2.安全......
  • 上周面的一个985女生,问了Transformer模型的内存优化
    Transformer模型现在很火,内存优化又很重要。上周面试了一个985大学的女生,跟她谈到了Transformer模型的内存优化问题。那么这个女生到底给出了哪些关于Transformer模型内存优化的独特思路呢?一起来看看。01什么是Transformer模型中的KV缓存?Transformer中文本是逐......
  • 基本类型大小,类大小及内存对齐
    讨论类大小时,我们设置系统为64位系统1)空类1字节空类中只包含一个内存地址,保存类对象的唯一地址空类对于一个空类,即使没有任何成员变量,编译器也会为其分配1字节的内存,以确保不同对象的地址唯一性2)包含虚函数的类a)只包含一个/多个虚函数的类8字节每个类的实例只会包含......
  • 数据在内存中的存储以及练习(一篇带你清晰搞懂)
    一:数据在内存中的存储首先,如果要了解数据在内存中的存储,我们首先要了解一个概念大小端是什么?1:什么是大小端?其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:大端(存储)模式:是......
  • Java 事务隔离级别及相关概念
    Java事务隔离级别及相关概念在数据库管理系统中,事务的隔离级别定义了一个事务与其他事务之间的相互影响程度。Java中的事务隔离级别主要遵循SQL标准,主要包括以下四种:读未提交(ReadUncommitted):允许读取未提交的数据,可能导致脏读(DirtyRead)。这是最低的隔离级别。读已......
  • Python和C++及MATLAB距离相关性生物医学样本统计量算法及数据科学
    ......
  • C语言内存函数
    1.memcpy的使用和模拟实现void*memcpy(void*destination,constvoid*source,size_tnum);函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置这个函数在遇到"\0"的时候并不会停下来如果source和destination有任何的重叠,复......
  • AVL树(平衡二叉树)的介绍以及相关构建
    欢迎光临:      羑悻的小杀马特-CSDN博客目录一·AVL树的介绍:二·AVL树的实现:1·结构框架:2·节点的插入: 旋转: 2·1左单旋:2.1.1左单旋介绍及步骤:2.1.2左单旋代码实现:2.1.3左单旋技巧总结: 2·2右单旋:2.2.1右单旋介绍及步骤:2.2.2右单旋代码实现:2.......
  • 了解网络的相关信息
    文章目录前言了解网络的相关信息1.ip是什么?1.1.公网IP:1.2.私有IP:1.2.1.示例2.子网掩码3.子网掩码的划分网段是什么4.特殊的回路IP网段(127.0.0.1)5.端口前言  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^_^。  而且听说......
  • 统计进程内存使用量
    统计进程内存使用量#!/bin/bash#文件名:memory_show.sh#作者:wanghongwei#日期:2024年9月29日#版本:1.0#描述:统计进程内存使用量#使用方式:./memory_show.sh[-k/-K][-m/-M][-g/-G]#初始化所有进程的统计变量declare-ATOTAL_MEM_SIZETOTAL_MEM_SIZ......