您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

浅谈Web应用的内存优化

时间:2019-08-29 09:35:32  来源:  作者:



随着 Web 应用复杂程度越来越高,以及 NodeJS 大规模投入生产环境,许多 Web 应用都会长时间运行, JAVAScript 的内存管理显得更为重要。

JavaScript 具备自动回收垃圾的机制, 执行环境会负责管理代码在执行环境过程中使用的内存,将某些不再被使用的的变量所占用的内存释放掉,正因如此,大多数情况我们在前端开发的时候,并不是那么关注我们的页面用了多少内存,是否合理,需不需要优化。

JavaScript 基础中有很多重要的知识点是和内存相关的,比如深拷贝和浅拷贝、闭包、原型、引用数据类型和引用传递等。

当然,关于 JS 的内存空间和内存相关的知识已经有很多专业的文章解释的很详细了,这里就不再赘述了。

比如关于 JS 内存空间的知识可以看看:内存空间详细图解

关于内存周期和垃圾回收的知识可以阅读参考 MDN 的文章,其他文章无外乎也是根据这个来介绍的:Memory_Management

关于 JavaScript 内存泄漏也可以看一下阮一峰老师的文章 JavaScript 内存泄漏教程

在 Web 应用开发中,我们应该注意:

1. 避免没有必要全局变量的使用

前端开发者都知道,在局部作用域中,当函数执行完毕,局部变量也就没有存在的必要了,它很容易被垃圾回收器回收,当使用全局变量定义值时,垃圾回收器,很难判断全局变量需要什么时候释放内存空间,因此是不会去对其进行回收销毁的。而该变量会一直存在老生代堆内存中,直到页面被关闭。

function setName () {
 name = "alloy";
}
 
// 等价
 
function setName () {
 window.name = "alloy"
}

另外一种意外情况是;

function setName (name) {
 this.name = name;
}
 
setName("alloy")

我们可以在 JS 文件的开头通过添加"use strict" 开启严格的解析模式,来避免一些意外创建的全局变量。

2. 及时解除引用

如果必须要一个全局变量来存储大量数据,那么请确保在用完之后将其赋值为 null。

delete 操作符用于删对象的某个属性;如果没有指向这个属性的引用,那它最终会释放。

但注意的一点是,尽量不要在需要密集运算的函数中去使用 delete,这很可能会引发浏览器在不恰当的时候的 GC,和其他语言一样,JavaScript 的 GC 策略无法避免 GC 时停止响应其他操作,而 JavaScript 的 GC 在 50ms 甚至以上,对普通应用还好,如果是对于操作频繁的 Web 应用或者游戏来说,就比价烦恼了。

const Room = {
 desks: 10,
 chairs: 22
};
 
console.log(Room.desks); // 10;
 
delete Row.desks;
 
console.log(Room.desks); // undefined

有时候我们虽然用 removeChild 移除了 button,但是还在 node 对象里保存着 #button 的引用,DOM 元素还在内存里面,需要及时解除引用。

var node = {
 button: document.getElementById('button');
};
 
document.body.removeChild(document.getElementById('button'));

3. 减少对象的创建

垃圾回收周期性运行,如果分配的内存非常多,或者新建很很多实例的话,那么回收工作也会很辛苦。

尽量避免在经常调用的方法中循环使用 new 对象,而且还要花时间对这些对象进行垃圾回收和处理。

设计模式中的享元模式就是为了减少对象的多次创建而来的。在我们可以控制的范围内,最大限度的重用对象。

4. 内存不是缓存

缓存在需求开发中举足轻重,但是很多时候我们会把许多大数据缓存在内存中,导致我们的内存占用始终处于高位,内存对任何程序开发都是寸土寸金 的,若果不是很重要的资源,请不要直接放在内存中,或者制定过期机制,自动销毁过期缓存。

5. 避免复杂的递归调用;

通常情况下,简单的递归调用还不至于导致堆栈溢出,但遇到复杂且每次调用需要 在栈里存储大量信息的时候,成千上万个此类空间累积起来,很容易就超过了栈空间。

6. 合理使用的 IndexedDB

其实这个是和 JS 关系不是很大,但是对于 Web 应用的影响却十分重要,曾经我遇到过一个用户案例,由于长时间的本地数据写入,和一些上报日志没有被及时清除,导致用户的浏览器中对应域名下的 IndexedDB 存储高达 12GB,浏览器在访问对应域名的时候,也可以初始化 IndexedDB 和读取本地存储的数据,而面对如此庞大的数据,浏览器内存暴涨,最后崩溃,避免过度依赖 IndexedDB,无脑写入数据而不做定期清理。

总结

这篇分享主要总结了我们在 Web 应用,可能会遇到的一些情况和注意的事情。

很多时候只要我们在编码的时候多加注意,可以避免很多问题。

希望本文能帮助到您!

点赞+转发,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓-_-)

关注 {我},享受文章首发体验!

每周重点攻克一个前端技术难点。更多精彩前端内容私信 我 回复“教程”!希望本文能帮助到您!

转载自AlloyTeam:http://www.alloyteam.com/2019/07/13858/



Tags:Web应用   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
一个渐进式的web应用程序与普通的网站没有任何不同——它由HTML、CSS和JavaScript组成,并存在于浏览器中。PWA与常规网站的区别在于,它列出了10个需要实现的关键概...【详细内容】
2021-10-20  Tags: Web应用  点击:(45)  评论:(0)  加入收藏
在讨论如何在应用程序中应用安全性之前,您应该首先了解如何保护应用程序。为了进行恶意操作,攻击者会识别并利用应用程序的漏洞。我们经常将漏洞描述为一种弱点,它可以允许执行...【详细内容】
2021-04-21  Tags: Web应用  点击:(186)  评论:(0)  加入收藏
WAF市场的发展缘于客户需要保护内外的Web应用程序。WAF保护Web应用程序和API免受各种攻击,包括自动机器人程序、注入攻击和应用层拒绝服务(DoS)攻击。它们应提供基于特征(signat...【详细内容】
2021-01-08  Tags: Web应用  点击:(960)  评论:(0)  加入收藏
当我在 Heroku 管理安全团队时,我经常做一个噩梦:我的 PagerDuty 警报响了,提醒我发生了安全事故。在梦中,我盯着手机并意识到“不,大事不好”——接着,我就被惊醒了。...【详细内容】
2020-12-07  Tags: Web应用  点击:(143)  评论:(0)  加入收藏
WAF是什么?WAF的全称是(Web Application Firewall)即Web应用防火墙,简称WAF。国际上公认的一种说法是:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提...【详细内容】
2020-11-12  Tags: Web应用  点击:(179)  评论:(0)  加入收藏
前言我们看到越来越多的人将他们的想法倾注到网页上。我们所指的这些人可能不熟悉网站设计和发布的技术细节,因此在建立他们的平台(网站)时可能会遇到一些问题。使用什么托管...【详细内容】
2020-10-24  Tags: Web应用  点击:(166)  评论:(0)  加入收藏
有网站的朋友们肯定了解web应用防火墙,这是目前主要防护网站安全的产品,web应用防火墙一般有三种形态,硬件、软件、云形态,一般软件和云形态用的最多,因为硬件WAF普遍价格在几十...【详细内容】
2020-09-11  Tags: Web应用  点击:(125)  评论:(0)  加入收藏
一、什么是 TypeScriptTypeScript 是近几年被火爆的应用了,这让大家产生了一个错觉:这么多的拥护者,难道TypeScript是一个新的语言?TypeScript是微软公司开发和维护的一种面向对...【详细内容】
2020-08-05  Tags: Web应用  点击:(70)  评论:(0)  加入收藏
提升Web应用的性能从未像今天这样刻不容缓。在线经济活动的比例日益提高,就连发展中国家和地区的经济活动都已经有5%以上在线进行了(相关数据请参考本文后面的资源)。在这个超...【详细内容】
2020-06-12  Tags: Web应用  点击:(261)  评论:(0)  加入收藏
众所周知,网站安全防护,对于企业非常重要。2020年HTTPS加密已经普及,传统的防火墙检测功能失效,所以对于网站来说,部署一个WEB应用防火墙十分重要,这方面商业产品很多,开源的也不少...【详细内容】
2020-05-28  Tags: Web应用  点击:(118)  评论:(0)  加入收藏
▌简易百科推荐
写一个shell获取本机ip地址、网关地址以及dns信息。经常会遇到取本机ip、网关、dns地址,windows一个命令ipconfig /all全部获取到,但linux系统却并非如此。linux系统都自带ifc...【详细内容】
2021-12-27  K佬食古    Tags:shell   点击:(2)  评论:(0)  加入收藏
步骤1、配置 /etc/sysconfig/network-scripts/ifcfg-eth0 里的文件。it动力的CentOS下的ifcfg-eth0的配置详情:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifc...【详细内容】
2021-12-24  忆梦如风    Tags:网卡   点击:(10)  评论:(0)  加入收藏
1、查找当前目录下所有以.tar结尾的文件然后移动到指定目录find . -name “*.tar” -execmv {}./backup/ ;注解:find –name 主要用于查找某个文件名字,-exec 、xargs可...【详细内容】
2021-12-17  郭主任    Tags:运维   点击:(20)  评论:(0)  加入收藏
对于经常上网的朋友来说,除了手机购物上网,pc端玩网页游戏还是很多小伙伴首选的,但是有时候明明宽带链接上了,打开浏览器却出现上不了网的现象,下面小编要来跟大家说说电脑有网络...【详细内容】
2021-12-16  小白系统    Tags:网页无法打开   点击:(28)  评论:(0)  加入收藏
在访问像github、gitlab这样的外国网站时,很有可能会出现页面加载不出来或找不到页面的错误。这时候有的朋友就会以为是网络的问题,于是把Wifi断掉连上自己手机的热点,结果却还...【详细内容】
2021-12-15  启施技术IT狼叔    Tags:外网   点击:(16)  评论:(0)  加入收藏
网络地址来源:获取公网IP地址 https://ipip.yy.com/get_ip_info.phphttp://pv.sohu.com/cityjson?ie=utf-8http://www.ip168.com/json.do?view=myipaddress...【详细内容】
2021-12-15  韦廷华12    Tags:外网ip   点击:(15)  评论:(0)  加入收藏
准备好软件IPOP、用ENSP模拟一下华为交换机 启动交换机 <Huawei>sysEnter system view, return user view with Ctrl+Z.[Huawei]sysname FTPClient[FTPClient]interface vla...【详细内容】
2021-12-15  思源Edward    Tags:交换机   点击:(24)  评论:(0)  加入收藏
我们经常用到netstat命令查看主机连接状况,包括连接ip、端口、状态等,今天就练习下shell分析netsat结果。描述假设netstat命令运行的结果我们存储在nowcoder.txt里,格式如下:Pro...【详细内容】
2021-12-14  K佬食古    Tags:netstat   点击:(19)  评论:(0)  加入收藏
什么是滑动窗口?窗口是操作系统开辟的一块缓存空间,发送方在收到接收方ACK应答之前,必须在缓冲区保留已发送的数据,如果按期收到确认应答,数据就可以从缓冲区移除。什么是滑动窗...【详细内容】
2021-12-14  DifferentJava    Tags:TCP   点击:(30)  评论:(0)  加入收藏
概述日常管理华为路由设备过程中,难为会忘记设备登录密码,那么该如何重置设备登录密码吗?本期文章将全面向各位小伙伴总结分享。重置华为设备登录密码思路先行 采用console登录...【详细内容】
2021-12-10  onme0    Tags:   点击:(27)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条