内存泄漏的隐形陷阱:console.log

console.log 本身不会直接导致内存泄漏,但在特定的场景下,其使用方式可能间接引发内存泄漏问题,特别是在以下情况:

1. console.log 引用闭包或对象

console.log 输出的数据如果包含引用类型(例如:对象、数组)或闭包,会导致浏览器的开发者工具对数据进行引用。开发者工具可能会保留对该数据的引用,以便后续检查和调试。

🌰:

function createClosure() {const largeArray = new Array(1000000).fill(1)console.log(largeArray) // 通过 console.log 引用了 largeArray
}
createClosure()

在上述代码中,console.log(largeArray) 会将 largeArray 保存在内存中,因为控制台会对它进行引用。如果没有清理,这种引用会导致该数据无法被垃圾回收机制清除,进而导致内存泄漏。

在页面上「点击按钮」打印数组,打印一次和多次的内存占用如图所示:

打印在控制台后,导致数据无法被回收,一方面暴露数据,另一方面占用内存。

2. 频繁调用 console.log

频繁调用 console.log 会使浏览器内存不断累积(特别是在循环或定时器中)。某些浏览器可能会将日志内容缓存在内存中,而频繁的日志输出可能导致内存膨胀。

🌰:

setInterval(() => {console.log('Logging data...')
}, 100) // 每 100 毫秒就输出一次日志

这段代码会持续输出日志,导致浏览器控制台的内存不断增长,尤其是在长时间运行的情况下可能会占用大量内存资源。

3. console.log 输出循环引用的对象

如果 console.log 输出的对象包含循环引用(即对象属性引用自身或其他关联对象),控制台会保留整个循环引用结构,阻止垃圾回收。

🌰:

const obj = {}
obj.self = obj // 循环引用
console.log(obj)

浏览器会保留整个对象的引用,即使 obj 不再需要,也无法被垃圾回收,从而导致内存泄露。

4. 如何避免呢?

1、代码编写

1)避免在循环或定时器中频繁调用 console.log;

2)避免对大型对象使用 console.log;

3)关闭开发者工具或清空控制台;

定期清空控制台(例如在 Chrome 开发者工具中使用 console.clear())来防止累积的日志占用内存。

4)使用弱引用避免内存泄漏;

对于频繁生成并可能被引用的数据,可以使用 WeakMap 或 WeakSet 等数据结构,确保这些数据在不再需要时可以自动被垃圾回收。

2、借助工具 terser

terser 是一个用于 JS 代码的压缩和混淆工具,能够减小文件大小、优化代码并提高加载速度。

在 Vue2 环境,Vue cli 的 webkit 内置 terser,使用如下:

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({transpileDependencies: true,terser: {terserOptions: {compress: {// 删除所有 console 语句drop_console: true,drop_debugger: true}}}
})

在 Vue3 环境,vite 下需要手动安装 terser,配置如下:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],build: {minify: 'terser',terserOptions: {compress: {drop_console: true,drop_debugger: true}}},
})

因此:在实际开发过程中,console.log 应只用于调试环境。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字IC后端实现Innovus |给各种IP子模块添加port buffer和antenna diode万能脚本

我们之前分享过在hierarchical flow后端实现中为了确保顶层flatten时timing signoff和physical signoff看到的情况和模块级看到的情况一致,我们会在模块io port添加io port buffer(主要是timing,antenna一致性)。实际上在芯片级我…

PSINS工具箱函数介绍——inserrplot

关于工具箱 i n s e r r p l o t inserrplot in

一个关于@JsonIgnore的isxxx()问题

一个关于JsonIgnore的问题 版本:2.13.5 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><optional>true</optional></dependency>代码&#xff1a; Data public clas…

多源BFS问题(1)_01矩阵

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 多源BFS问题(1)_01矩阵 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1. 题…

前端请求格式

1.multipart/form-data格式发送请求参数 什么时候用&#xff1a; 当后端API要求以表单的形式接收数据时&#xff0c;比如<input type"text" name"username">和<input type"password" name"password">&#xff0c;这些数据…

Java案例——屏蔽信息

首先这次的案例需要用到substring方法&#xff0c;先了解一下&#xff1a; 首先我们来加密一下电话号码&#xff1b; package String; public class Demo_06 {public static void main(String[] args) {// 定义一个电话号码字符串String phoneNumber"13111112598"…

精选:HR招聘管理工具Top5使用体验

作为企业招聘者&#xff0c;如何在选择中找到开启高效招聘之门的钥匙&#xff0c;成为了每一位企业招聘管理者必须面对的难题&#xff0c;在面对市场上琳琅满目的招聘工具&#xff0c;你是否也曾感到无头绪&#xff0c;不知所措&#xff1f;每个工具都声称自己拥有独特的优势和…

【MySQL】JDBC的连接

目录 一. 具体操作如下 1.注册驱动 二.实操 JDBC&#xff08;Java DataBase Connectivity&#xff09;java 数据库连接&#xff0c;是 JavaEE 平台下的技术规范&#xff0c;其定义了在 Java 语言中连接数据&#xff0c;执行 SQL 语句的标准&#xff0c;可以为多种关系数据库…

二叉树的链式表示及实现(实验6--作业)

一、功能概述 这段 C 代码实现了二叉树的一系列操作&#xff0c;包括创建二叉树、前序遍历、中序遍历、后序遍历、层次遍历、中序非递归遍历、求二叉树深度、交换左右子树、统计节点个数以及销毁二叉树等功能。 二、主要数据结构和类型定义 BiTNode结构体表示二叉树的节点&a…

三维测量与建模笔记 - 2.1 坐标转换基础

2D坐标变换 平移可以看做是对原始的x和y加上了一个偏移&#xff0c;也可以理解为按照给定的平移向量进行移动。 缩放变换&#xff0c;本质是对x&#xff0c;y乘上一个缩放系数。 综合缩放、旋转、平移 矩阵乘法的顺序会对结果有影响&#xff0c;需要注意。 2D欧氏变换 2D欧式…

LeetCode_2119. 反转两次的数字_java

1、题目 2119. 反转两次的数字https://leetcode.cn/problems/a-number-after-a-double-reversal/ 反转 一个整数意味着倒置它的所有位。 例如&#xff0c;反转 2021 得到 1202 。反转 12300 得到 321 &#xff0c;不保留前导零 。 给你一个整数 num &#xff0c;反转 num 得…

二十四、Python基础语法(变量进阶)

一、引用 在定义变量的时候, 解释器会给变量和数据分别在内存中分配内存&#xff0c;变量中保存的是数据的地址, 称为引用&#xff0c;Python 中数据的传递,传递的都是引用&#xff0c;可以使用 id(变量) 函数,获取变量中引用地址。 # 将数字1在内存中的地址储存到变量a中 a …

NVR监测软件/设备EasyNVRNVR批量管理软件/平台多元接入方式与应用实例

在数字化安防时代&#xff0c;视频监控技术已成为维护公共安全、提升管理效能的重要基石。随着科技的飞速发展&#xff0c;流媒体技术和视频监控正经历着前所未有的变革与融合。NVR小程序接入平台/设备EasyNVR&#xff0c;作为一款基于“云-边-端”一体化架构的视频融合云平台&…

【归一化技术】层归一化和批归一化

归一化技术在深度学习中被广泛应用&#xff0c;以加速训练过程、稳定模型收敛&#xff0c;并减少梯度消失或爆炸问题。 一、 层归一化 **层归一化&#xff08;Layer Normalization&#xff09;**是一种归一化技术&#xff0c;广泛用于深度学习模型&#xff0c;尤其是在 Trans…

RWA“两链一桥”平台在香港金融科技周亮相

第九届香港金融科技周今日开幕&#xff0c;记者在主题为Trust Bridge的论坛上获悉&#xff0c;蚂蚁数科旗下蚂蚁链在此次金融科技周首次公开了其为RWA业务打造的“两链一桥”平台&#xff0c;旨在帮助更多内地新能源资产赴港RWA&#xff0c;实现技术赋能实体资产。 “两链一桥“…

简记Vue3(二)—— computed、watch、watchEffect

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Android Gradle

#1024程序员节&#xff5c;征文# Gradle 是一款强大的自动化构建工具&#xff0c;广泛应用于 Android 应用开发。它通过灵活的配置和丰富的插件系统&#xff0c;为项目构建提供了极大的便利。本文只是简单的介绍 Gradle 在 Android 开发中的使用&#xff0c;包括其核心概念、构…

Go 语言基础教程:7.Switch 语句

在这篇教程中&#xff0c;我们将学习 Go 语言中的 switch 语句&#xff0c;它是条件分支的重要结构。我们将通过一个示例程序逐步解析 switch 的不同用法。 package mainimport ("fmt""time" )func main() {i : 2fmt.Print("Write ", i, " …

拖拽盖章处理

进行元素拖拽&#xff1a;同类章替换、删除已盖章 1.复制对应元素&#xff0c;在onmousemove中left和top一直在变化 2.onmouseup时&#xff0c;计算出在pdf显示区域内的left&#xff0c;top&#xff0c;removeChild删除原先复制的元素&#xff0c;再appendChild到pdf显示区域的…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…