您现在的位置是:主页 > Web前端技术 > Web前端技术

Node中堆内存分配的示例分析

IDCBT2022-01-13服务器技术人已围观

简介这篇文章将为大家详细讲解有关Node中堆内存分配的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 V8 垃圾回收简介 首先,简单介

这篇文章将为大家详细讲解有关Node中堆内存分配的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

V8 垃圾回收简介

首先,简单介绍一下V8垃圾回收器。内存的存储分配方式是堆(heap),堆被分为几个世代(generational)区域。 对象在它的生命周期中随着年龄的变化,它所属的世代也有所不同。

世代中分为年轻一代和老一代,而年轻的一代还分为了新生代和中间代。随着对象在垃圾回收中幸存下来,它们也会加入老一代。

世代假说的基本原则是大多数对象都是年轻的。V8 垃圾回收器基于这一点,只提升在垃圾回收中幸存下来的对象。随着对象被复制到相邻区域,它们最终会进入老一代。

在Nodejs中内存消耗主要分为三个方面:

    代码-代码执行时所在的位置

    调用栈-用于存放具有原始类型(数字,字符串或布尔值)的函数和局部变量

    堆内存

    堆内存是我们今天的主要关注点。 现在您对垃圾回收器有了更多的了解,是时候在堆上分配一些内存了!

    function allocateMemory(size) {
      // Simulate allocation of bytes
      const numbers = size / 8;
      const arr = [];
      arr.length = numbers;
      for (let i = 0; i < numbers; i++) {
        arr[i] = i;
      }
      return arr;
    }

    在调用栈中,局部变量随着函数调用结束而销毁。基础类型 number永远不会进入堆内存,而是在调用栈中分配。但是对象arr将进入堆中并且可能在垃圾回收中幸存下来。

    堆内存有限制吗?

    现在进行勇敢测试——将 Node 进程推到极限看看在哪个地方会耗尽堆内存:

    const memoryLeakAllocations = [];
    
    const field = "heapUsed";
    const allocationStep = 10000 * 1024; // 10MB
    
    const TIME_INTERVAL_IN_MSEC = 40;
    
    setInterval(() => {
      const allocation = allocateMemory(allocationStep);
    
      memoryLeakAllocations.push(allocation);
    
      const mu = process.memoryUsage();
      // # bytes / KB / MB / GB
      const gbNow = mu[field] / 1024 / 1024 / 1024;
      const gbRounded = Math.round(gbNow * 100) / 100;
    
      console.log(`Heap allocated ${gbRounded} GB`);
    }, TIME_INTERVAL_IN_MSEC);

    标签:

    很赞哦! ()

本栏推荐