• 【读书笔记】《深入浅出nodejs》第五章 内存控制


    海量请求+长时间运行 -> 内存控制 -> 一切资源高效循环利用

    1. V8的垃圾回收机制与内存限制

      在Node中通过JavaScript使用内存时,只能使用部分内存(64位系统下约1.4GB,32位系统下约为0.7GB)。

      在V8中,所有的JavaScript对象都是通过堆来进行分配的,当申请的堆空闲内存不够分配新的对象,将继续申请堆内存,直到堆得大小超过V8的限制为止。

      为什么V8要限制堆得大小?

        -> (1)V8最初为浏览器设计,不太可能遇到用大量内存的场景。

        -> (2)V8的垃圾回收机制限制。(1.5GB的垃圾回收堆内存,需要大约50毫秒以上,这使得应用性能和响应能力会直线下降)

      突破V8限制:

        -> $node --max-old-space-size = 1700 (单位MB) or 

        -> $node --max-new-space-size =1024 (单位KB)

      V8的垃圾回收机制 ---- 分代式垃圾回收机制

      查看垃圾回收机制 ---- $node --trace_gc -e "var a = [];for (var i=0; i<1000000; i++) a.push(new Array(100));" > gc.log

    2. 高效使用内存

      (1)了解作用域

      (2)了解闭包

      无法立即回收的内存有:

        ->闭包

        ->全局变量引用

      因此,要小心此类变量的无限制添加

    3. 内存指标

      --会存在一些我们认为会回收但是却没有被回收的对象,这会导致内存占用无限增长。一旦增长达到V8内存限制,将会得到内存溢出错误,进而导致进程退出。

      (1)查看内存使用情况 -> $node >process.memoryUsage() {

          {

           rss (resident set size 进程的常驻内存部分):132852672, (除此外,内存其余部分在交换区(swap)或文件系统(filesystem)中)

             heapTotal(堆中总共申请的内存量) :6131200,

             heapUsed(目前堆中使用中的内存量):2757120,

          }

      (2)查看系统内存占用

          -> $node >os.totalmem()  “系统的总内存”

          -> $node >os.freemem() “系统的闲置内存”

      (3)堆外内存

      受V8的垃圾回收限制的主要是V8的堆内存。

    4. 内存泄漏

      造成内存泄漏的原因:

        (1)缓存

        (2)队列消费不及时

        (3)作用域未释放

    5. 内存泄漏排查

      使用常见工具:

        (1)node-heapdump

        (2)node-memwatch

    6. 大内存应用

  • 相关阅读:
    django + scrapy 部署
    scrapyd 爬虫部署
    爬虫部署
    使用Scrapy爬取图片入库,并保存在本地
    学习Spider 了解 Scrapy的流程
    Django 的 一些基本操作:视图函数,路由配置
    Django 了解
    sql
    嚯嚯~ module 1
    Long Way To Go 之 Python 5 (2)
  • 原文地址:https://www.cnblogs.com/libinfs/p/5922447.html
Copyright © 2020-2023  润新知