【程序员日记】一行console.log引发的血案

▒ 目录 ▒

    • 🛫 导读
      • 需求
      • 开发环境
    • 1️⃣ 艰难的排查过程
      • 1. 程序闪退
      • 2. 确定为内存泄漏
      • 3. 误入歧途
      • 4. 二分法注释代码
      • 5. 猿脑猜想
    • 2️⃣ 排查
      • procexp.exe
      • Performance 和 Memory
    • 3️⃣ 剔除生产环境中的console.log
      • webpack插件terser-webpack-plugin
    • 🛬 文章小结
    • 📖 参考资料

🛫 导读

需求

最近公司使用electron中出现内存泄漏的情况。经过n天的努力,最后定位到console.log的问题。
这好像不是第一次遇到类似的问题,特此记录,以敬后效。

开发环境

版本号描述
文章日期2023-11-04
操作系统Win10 - 22H219045.3570

1️⃣ 艰难的排查过程

1. 程序闪退

开发过程中程序一切运行正常,到了测试那里,出现崩溃情况。
多次尝试发现半个小时左右就崩溃了,多个电脑都是这样的。

2. 确定为内存泄漏

一开始一直以为是自己开发的node模块代码异常,导致崩溃。
后来看了下任务管理器的内存,发现某个render进程内存螺旋式上升,积累到半个小时候就崩溃了。
结论:

  • 内存泄漏导致崩溃
  • 大概率不是node模块导致的,因为是render进程不断的增大。

3. 误入歧途

排查问题最笨的思路就是注释代码。由于各种原因,我们也是这条路排查的。
当我们注释掉某封包逻辑后发现一切运行正常。于是猜测是封包的库导致的问题,当即想的是换个库试试。

4. 二分法注释代码

后来某大佬说,可能是用法不对,逐步注释代码试试。然后二分法注释代码,最后在WebSocket的某回调函数内发现,注释了console.log,让一切恢复正常了。

5. 猿脑猜想

该代码会将接受的内容(3Mb左右的对象)打印出来,最后发现该对象未被释放。至于为何未释放,这里也只留下几个猜想:

  • WebSocket回调函数对该对象进行了引用,导致GC不能释放。
  • WebSocket回调函数对该对象进行了缓存(方便后续调用),缓存队列巨大(上千的长度),chrome内存是有上限的(各个版本不一样的,我们用的x86的,据说在2G左右),达到上限的时候,还未出发其内存回收。

2️⃣ 排查

procexp.exe

作为专业的windows工具procexp.exe,提供了查看内存变换的功能,我们可以通过它看到一些内存上的规律。
小编遇到的问题,可以在这上面发现,每2秒,内存增加3Mb左右。这个大小刚好是我们传递的某个对象,通过它能快速定位问题。

procexp.exe默认没有显示Private Delta Bytes选项,我们通过下面的步骤打开该列。

  1. 右键表头,打开对话框
    在这里插入图片描述
    2.选择Process Memory标签页,然后选择Private Delta Bytes选项
    在这里插入图片描述
  • 模拟内存增长:
    如下图,不断的执行window.___=[]; ___.push(new Array(2*1000*1000));,可以查看到内存增长!
    在这里插入图片描述

ps: windows自带的任务管理器也有类似的功能(貌似win11后的某个新版本才有的)。

Performance 和 Memory

这个操作就很专业了,具体细节很多,小编发现一篇很不错的文章:《console.log 一定会导致内存泄漏? 》https://juejin.cn/post/7185501830040944698,这里就不画蛇添足了,有兴趣的直接看该文章即可。

3️⃣ 剔除生产环境中的console.log

webpack插件terser-webpack-plugin

erser-webpack-plugin 是一个 Webpack 的插件,它主要用于对 JavaScript 代码进行压缩和优化。
它通过使用 Terser 这个 JavaScript 压缩库,来实现对 JavaScript 代码的压缩和优化。Terser 是一个非常强大的压缩库,它能够减小 JavaScript 代码的体积,并提高代码的运行效率。

terser-webpack-plugin 插件的使用非常简单,只需要在 Webpack 的配置中添加这个插件,并设置相关的选项即可。可以进行如下配置,保证生成环境中不包含console系列函数:

module.exports = {
  optimization: {
    minimizer: [
      new TerserPlugin({
        terserOptions: {
          // 你的压缩选项
          compress: {
            // drop_console为true时,将删除所有console的函数
            drop_console: process.env.NODE_ENV==='production',
            drop_debugger: true,
            pure_funcs: ["console.log", "console.warn"]
          }
        }
      }),
    ],
  },
};

🛬 文章小结

首先,我们需要明确一点,console.log 本身并不会造成内存泄漏。内存泄漏是指在程序运行过程中,一些不再需要的对象或资源仍然被占用,导致内存无法被释放,从而导致程序运行缓慢或崩溃。

我们来分析一下可能导致内存泄漏的原因。主要有以下几种可能:

  • 闭包:如果在 console.log 中使用了闭包,并且该闭包中引用了外部的变量或对象,那么这些变量或对象就不会被垃圾回收器回收,从而导致内存泄漏。
  • 对象池:如果在代码中使用了对象池技术,例如Pool 或cache,那么这些对象可能会被长期占用,从而导致内存泄漏。
  • 循环引用:如果在代码中存在两个或多个对象之间的循环引用,例如A引用了B,B引用了A,那么这些对象就不会被垃圾回收器回收,从而导致内存泄漏。

综上所述,console.log 本身并不会造成内存泄漏。但是,如果在代码中使用了不当的闭包、对象池或循环引用,那么这些因素可能会导致内存泄漏。
因此,在编写代码时,我们需要注意避免这些问题,以保证程序的稳定性和性能。而且尽可能的别让 console.log 上生产!

📖 参考资料

  • console.log 一定会导致内存泄漏?不打开 devtools 就不会 https://juejin.cn/post/7185501830040944698
  • 千万别让 console.log 上生产! https://juejin.cn/post/7185128318235541563

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

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

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

相关文章

VX-3R APRS发射试验

VX-3R本身是不带APRS功能的,不过可能通过外加TNC实现APRS功能。 有大佬已经用Arduino实现了相应的发射功能: https://github.com/handiko/Arduino-APRS 我要做的,就是简单修改一下代码,做一个转接板。 YEASU官方没有给出VX-3R的音…

ch0_OSI 七层网络协议介绍

目录 概述 1、三网融合的概念 三网:电信网络、有线电视网络、计算机网络 概念:把上述三种网络融合成一种网络 2、计算机网络的定义、分类 定义:计算机网络是将地理位置不同的独立计算机系统,通过传输介质链接起来&#xff0c…

7-4 修理牧场 分数 15

#include<iostream> #include<queue> using namespace std; #define maxn 10005int main() {int n 0, data 0;cin >> n;//建小堆: //上调建堆中用greater: 父大子小 父子交换 小的上去 大的下去 priority_queue<int, vector<int>, greater<int…

vue+asp.net Web api前后端分离项目发布部署

一、前后端项目介绍 1.前端项目是使用vue脚手架进行创建的。 脚手架版本&#xff1a;vue/cli 5.0.8 编译器版本&#xff1a;vs code 1.82.2 2.后端是一个asp.net Core Web API 项目 后端框架版本&#xff1a;.NET 6.0 编译器版本&#xff1a;vs 2022 二、发布部署步骤 第…

静态链表的定义与实现(数据结构与算法)

1. 静态链表 用数组的方式实现的链表 单链表&#xff1a; 各个结点在内存中星罗棋布、散落天涯 静态链表&#xff1a;分配一整片连续的内存空间&#xff0c; 各个结点集中安置。 1.1 静态链表的优点 不需要像动态链表那样频繁地进行内存分配和释放&#xff0c;可以节省内存…

缺陷之灵魂操作bug

一、前言 正常来说&#xff0c;我们在测试缺陷的时候都是按照case来测试的&#xff0c;但是有些场景&#xff0c;例如说发散思维这种场景&#xff0c;就会找到一些比较不太正常、不好复现的缺陷&#xff0c;然后如果要辅助研发修复&#xff0c;就会极为痛苦。 二、场景描述 大…

mysql迁移data目录(Linux-Centos)

随着时间的推移&#xff0c;mysql的数据量越越大&#xff0c;使用yum默认安装的目录为系统盘 /var/lib/mysql&#xff0c;现重新挂载了一个硬盘&#xff0c;需要做数据目录的迁移到 /mnt/data/。以解决占用系统盘过高情况。 1.强烈建议这种操作。镜像一个一样的Centos系统&…

掌控你的Mac性能:System Dashboard Pro,一款专业的系统监视器

作为Mac用户&#xff0c;你是否曾经想要更好地了解你的电脑性能&#xff0c;以便优化其运行&#xff1f;是否想要实时监控系统状态&#xff0c;以便及时发现并解决问题&#xff1f;如果你有这样的需求&#xff0c;那么System Dashboard Pro就是你的不二之选。 System Dashboar…

sitespeedio.io 前端页面监控安装部署接入influxdb 到grafana

1.docker部署influxdb,部署1.8一下&#xff0c;不然语法有变化后面用不了grafana模板 docker run -d -p 8086:8086 --name influxdb -v $PWD/influxdb-data:/var/lib/influxdb influxdb:1.7.11-alpine docker exec -it influxdb_id bash #influx create user admin with pass…

JavaScript从入门到精通系列第二十九篇:正则表达式初体验

大神链接&#xff1a;作者有幸结识技术大神孙哥为好友&#xff0c;获益匪浅。现在把孙哥视频分享给大家。 孙哥链接&#xff1a;孙哥个人主页 作者简介&#xff1a;一个颜值99分&#xff0c;只比孙哥差一点的程序员 本专栏简介&#xff1a;话不多说&#xff0c;让我们一起干翻J…

modesim verilog仿真验证基本流程(新建工程方式)

文章目录 环境搭建一、在modelsim里创建一个新的工程二、新建verilog设计文件及仿真激励文件三、仿真结果本文演示如何使用modelsim新建工程进行功能仿真。 环境搭建 本文中采用的modelsim版本如下: modelsim altera 10.3d一、在modelsim里创建一个新的工程 打开modelsim软…

基于java+springboot+vue在线选课系统

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、课程管理、专业管理、院系信息管理、学生…

学习经验分享【NO.18】YOLOv5可视化特征图教程(持续更新)

YOLOv5项目的6.0以上版本中的detect.pt中集成了可视化相关模块&#xff0c;直接调用即可。 一、可视化特征提取网络中所有模块的可视化图 添加形参如下所示&#xff0c;加载相应的权值文件后&#xff0c;选择相应的图片。 运行detect.py文件后得到如下所示&#xff1a; 以stag…

stm32 DMA

目录 简介 框图 DMA请求 DMA通道 DMA优先级 DMA 数据 外设到存储器 存储器到外设 存储器到存储器 传多少&#xff0c;单位是什么 传输完成 hal库代码 标准库代码 简介 CPU根据代码内容执行指令&#xff0c;这些众多指令中&#xff0c;有的用于计算、有的用于控制程…

汽车标定技术(一):XCP概述

目录 1.汽车标定概述 2.XCP协议由来及版本介绍 3.XCP技术通览 3.1 XCP上下机通信模型 3.2 XCP指令集 3.2.1 XCP帧结构定义 3.2.2 标准指令集 3.2.3 标定指令集 3.2.4 页切换指令集 3.2.5 数据采集指令集 3.2.6 刷写指令集 3.3 ECU描述文件(A2L)概述 3.3.1 标定上位…

python把Word题库转成Excle题库

又到了一年一度的背题时刻&#xff0c;但是收到的题库是Word版的&#xff0c;页数特别多 话不多说&#xff0c;上代码&#xff0c;有图有真相&#xff0c;代码里面备注的很详细 # 导入所需库 import csv import os import refrom docx import Document from win32com import c…

nvm 下载 nodejs 速度慢问题解决

1、找到 nvm 的下载目录&#xff0c;在目录下找到 settings.txt 文件 2、打开 settings.txt 文件 &#xff0c;添加以下代码&#xff1a; node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors/npm/添加完成后再去下载即可。

【网络协议】聊聊HTTPS协议

前面的文章&#xff0c;我们描述了网络是怎样进行传输数据包的&#xff0c;但是网络是不安全的&#xff0c;对于这种流量门户网站其实还好&#xff0c;对于支付类场景其实容易将数据泄漏&#xff0c;所以安全的方式是通过加密&#xff0c;加密方式主要是对称加密和非对称加密。…

ES-初识ES

文章目录 介绍ElasticSearchElasticSearch的主要功能ElasticSearch的主要特性ElasticSearch的家族成员LogStashKibanaBeats ELK&#xff08;ElasticSearch LogStash Kibana&#xff09;的应用场景与数据库集成指标采集/日志分析 安装和配置ElasticSearch一、安装1、下载ES安装…

联通智网科技正式入选国家级专精特新“小巨人”企业

近日&#xff0c;北京市经济和信息化局发布《第五批专精特新“小巨人”企业公告名单》&#xff0c;根据工业和信息化部发布的《工业和信息化部关于公布第五批专精特新“小巨人”企业和通过复核的第二批专精特新“小巨人”企业名单的通告》&#xff0c;联通智网科技股份有限公司…