nodejs的内存管理,垃圾回收机制

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

要点记录:

1、网页js、命令行工具,快进快出的,即时内存泄露,无内存管理必要!

2、服务器端nodejs和其他正规语言一样存在内存泄露。

3、nodejs基于谷歌v8js引擎,速度很快,垃圾回收也是由v8维护的

4、通过查看源码可发现v8中用js使用内存的限制约为:64位-1.4G  32位 -0.7G。这是源于v8的垃圾回收机制的限制,可在node 后加 --max-old|new-space-size=xxx来改变内存限制

5、nodejs进程的内存占用:堆内内存+堆外内存=rss+swap+fs,
其中v8申请和分配的为堆内内存,所有js实体都是通过堆来分配的。process.memoryUsage() 可查看常驻内存rss,heapTotal总堆内存,和已分配的堆内存heapUsed
非V8分配的内存为堆外内存,如 Buffer对象占据的内存,用在网络流和文件流中
os.totalmem  os.freemem 可查看系统的总内存和可用 内存

6、v8的垃圾回收算法

统计学知识的应用,按对象存活时间将内存的垃圾回收进行不同的分代,对这些不同的分代分别实施不同的回收算法

v8中将内存主分为新生代 和 老生代 空间,前者存活时间短,后者较长或常驻

7、新生代中活对象较少,采用scavenge-cheney算法:将新生代一分为二,From ->To ,新对象分配在from中,回收时将From中活的对象从From复制到To,释放From,然后From和To互换角色。

8、一个对象从From复制到To时,如果ta之前经历过一次scavenge复制,或者to空间已经使用了25%了,则该对象会直接晋升到老生代空间中,接受其他回收算法

9、老生代活对象较多,采用mark-sweep和mark-compact相结合的方法:m-s,不再划分内存空间,标记阶段标记所有活的对象,清理阶段清除释放所有未标记(死了的)对象,这一步会产生内存空间碎片,因此出现了m-c,边标记边将活动的对象往内存空间的一端 移动,清理时直接清理活死对象边界死的那端。移动对象是耗时的,所以主要使用 m-s算法,当不足以分配空间给从新生代晋升来的对象时,才使用m-c回收。

10、全停顿---每次垃圾回收时都会暂停应用逻辑,是为了避免应用逻辑和回收器看到的对象不一致。

11、增量动作,v8的分代垃圾回收中,分为full和part方式,part只回收新生代的,因为新生代空间小啊,全停顿影响不大,但是full回收会回收老生代的,全停顿的时间就不能接受了,于是就有了 增量式标记incremental marking。即将标记工作分步,每步和应用逻辑交替执行,这样最大停顿时间减少很多,(六分之一);
其他阶段就有:延迟清理,增量式整理compact,利用多核来并行标记和清理

12、查看垃圾回收动作日志:启动node时 加 --trace_gc 参数, --prof参数可得到v8执行性能参数,用*-tick-processor查看

13、无法立即回收的内存有全局变量和闭包,尽量使用变量赋值为null|undefined来触发回收

14、内存泄露:该回收的对象出现意外没有被回收,来自于:缓存,队列消费不及时,作用域未释放

15、慎用内存当缓存,非用的话控制好缓存的大小和过期时间,方式出现永远无法释放的问题,采用redis,memX

16、数组、回调,生产者的速度比消费者速度快,堆积了大量生产者导致无法释放作用域或变量: 队列监控,异步调用应包含超时处理机制

17、内存泄露排查,网上搜索node应用内存查看分析工具

node-headdump

node-memwatch


18、大文件处理使用stream模块

转载于:https://my.oschina.net/jingxing05/blog/270248

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

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

相关文章

Redis【第二篇】集群搭建

第一步:准备 1.安装包 ruby-2.4.0.tar.gz rubygems-2.6.10.tgz zlib-1.2.11.tar.gz redis-3.3.2.gem 2. 架构: 名称IP端口节点属性redisA192.168.6.1286379主节点redisB192.168.6.1289379从节点redisC192.168.6.1296379主节点redisD192.168.6.1299379从节…

(转)java中对集合对象list的几种循环访问总结

Java集合的Stack、Queue、Map的遍历在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack、Queue、Map类型的遍历,还是有一些讲究的。最近看了一些代码,在便利Map时…

NET框架下如何使用PaddleOCRSharp

打开VSIDE,新建Windows窗体应用(.NETFramework)类型的项目,选择一个.NET框架,如.NETFramework 4.0,右键点击项目,选择属性》生成,目标平台设置成X64.菜单》工具》选项,Nuget包管理器》程序包管理&#xff0…

Redis主从复制(Master-Slave Replication)

案例测试&#xff1a;1. Master新增网卡&#xff0c;修改server端配置IP : 192.168.40.128/24注释&#xff1a; bind&#xff0c;支持网络连接2. 新建虚机slave&#xff0c;配置网络&#xff0c;修改redis配置#slaveof <masterip> <masterport>slaveof 192.168.40.…

如何对一组 IP 地址 进行排序?

咨询区 Cracker我有一组如下IP地址。192.168.1.5 69.52.220.44 10.152.16.23 192.168.3.10 192.168.1.4 192.168.2.1我在寻找一个方法将他们排序成如下顺序。10.152.16.23 69.52.220.44 192.168.1.4 192.168.1.5 192.168.2.1回答区 Alex Aza对 ip 地址进行排序&#xff0c;大概…

如何为APK签名?

1.用来生成应用签名的文件①默认: debug.keystore > debug签名的应用程序不能在Android Market上架销售&#xff0c;它会强制你使用自己的签名。> 不同电脑使用此文件生成的签名不一样。那就意味着如果你换了机器进行apk版本升级&#xff0c;那么将会出现上面那种程序不能…

基于 Azure 的认知服务将文本合成语音

基于 Azure 的认知服务将文本合成语音Intro前几天发了一个 .NET 20 周年祝福视频&#xff0c;语音是通过 Azure 的认知服务合成的&#xff0c;下面就来介绍一下如何将使用 Azure 的认识服务实现将文本合成为语音Prepare你可以在 Azure Portal 上创建一个免费的语音服务&#xf…

sql查询结果集根据指定条件排序的方法

oracle认为 null 最大。 升序排列&#xff0c;默认情况下&#xff0c;null值排后面。 降序排序&#xff0c;默认情况下&#xff0c;null值排前面。 有几种办法改变这种情况&#xff1a; &#xff08;1&#xff09;用 nvl 函数或decode 函数 将null转换为一特定值 &#xff08;2…

mysql怎么改字体编码_mysql怎么改字符编码?

mysql命令行修改字符编码1、修改数据库字符编码mysql> alter database mydb character set utf8 ;2、创建数据库时&#xff0c;指定数据库的字符编码mysql> create database mydb character set utf8 ;3、查看mysql数据库的字符编码mysql> show variables like charac…

如何编译 dotnet/runtime 源代码

前言最近&#xff0c;准备为 dotnet/runtime 修改 issue&#xff0c;但是在 clone 代码后&#xff0c;发现要编译成功&#xff0c;远没有想象中那么容易。因此&#xff0c;将整个过程进行记录&#xff0c;以供大家参考。以下操作都是在 Windows 10 下完成。0.环境准备详见官方文…

jenkins maven testng selenium自动化持续集成

准备环境 首先我们新建一个maven的工程&#xff0c;并且在pom.xml中配置好我们依赖的一些jar包 <dependencies><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>2.46.0<…

java程序 开发工具_15款Java程序员必备的开发工具

如果你是一名Web开发人员&#xff0c;那么用膝盖想也知道你的职业生涯大部分将使用Java而度过。这是一款商业级的编程语言&#xff0c;我们没有办法不接触它。对于Java&#xff0c;有两种截然不同的观点&#xff1a;一种认为Java是最简单功能***大的编程语言之一&#xff0c;另…

SQLite编译问题

从http://www.sqlite.org/主页上获得了SQLite的源文件&#xff0c;还没有时间研究就在编译上发生了不小的问题。 首先是碰到是&#xff0c;编译之后&#xff0c;只产生了sqlite3.dll文件&#xff0c;不产生对应的lib库文件。 查看了下sqlite3.h代码&#xff0c;发现了SQLITE_AP…

mysql的调试与分析_mysql日志管理分析调试实例_MySQL

以下的文章主要介绍的是MySQL 操作日志查看的实际操作步骤以及对其实际操作步骤的具体描述&#xff0c;假如你在实际操作中遇到相似的情况&#xff0c;但是你却不知道对其如何正确的解决&#xff0c;那么以下的文章对你而言一定是良师益友。刚接触MySQL不久&#xff0c;发现缺少…

.NET 7 预览版 1 发布

宣布 .NET 7 预览版 1Jeremy 2022 年 2 月 17 日今天&#xff0c;我们很高兴地宣布 .NET 历史上的下一个里程碑。在庆祝社区和 20 年创新的同时&#xff0c;.NET 7 Preview 1 标志着迈向 .NET 下一个 20 年的第一步。ASP.NET Core Preview 1 和 EF7 Preview 1 也在今天发布。.N…

你一写长文章就焦虑拖延?

这是病&#xff0c;得治。 症状 每年春季学期&#xff0c;总会有一些人很烦躁。 别人晒朋友圈&#xff0c;他留言说不中听的话&#xff1b;你见他突然妄自菲薄&#xff0c;开导劝慰他&#xff0c;却被辩驳甚至骂一通&#xff1b;一点儿小事儿&#xff0c;都能激起他胸中的愤怒&…

5.7.21mysql数据库_【数据库】mysql5.7.21 winx64安装配置图文分享

本文主要为大家详细介绍了mysql 5.7.21 winx64安装配置方法图文教程&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下&#xff0c;希望能帮助到大家。1、将下载好的mysql压缩包解压到安装目录下2、新建文件my.ini&#xff0c;放置到mysql安装目录下&am…

.NET7的七项重大改进!

.NET 7 Preview1发布了&#xff0c;没时间实操&#xff1f;先快来看看.NET7的七项重大改进&#xff01;1、不再支持.NET 7应用程序、运行时和SDK的多级查找&#xff08;MLL&#xff09;2、PATH停止向.NET 7运行时和SDK添加32位.NET3、默认情况下&#xff0c; dotnet build/publ…

Spring Boot 入门小目标 3 --- 先来试着热部署

2019独角兽企业重金招聘Python工程师标准>>> Spring Boot 入门小目标---先来试着热部署 这次写的主要就是 使用 springloaded 来实现 热部署。 很多时候&#xff0c;我们在修改和添加了新的方法或代码&#xff0c;都需要重启服务器。这样很麻烦&#xff0c;而且 不合…

基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...

原文链接&#xff1a;https://logcorner.com/building-micro-services-through-event-driven-architecture-part19-building-and-securing-real-time-communications-using-signalr-and-azure-active-directory/命令 HTTP API 将事件存储到事件存储&#xff0c;但不直接将它们发…