首页 > 系统相关 >【前端调试】- 利用 Performance 和 Memory 分析内存

【前端调试】- 利用 Performance 和 Memory 分析内存

时间:2023-01-09 21:14:44浏览次数:55  
标签:泄漏 console log 点击 GC 内存 Memory Performance

欢迎阅读本系列其他文章
【前端调试】- 更好的调试方式 VSCode Debugger
【前端调试】- 断点调试的正确打开方式
【前端调试】- 借助Performance分析并优化性能

分析:

下面的代码就是一个按钮,点击之后创建一个数组,执行一些计算。

很常见的逻辑。

我们最后加了一个 console.log 打印了下这个数组。

  const testGc = () => {
    const testGcValue = new Array(10000000);
    console.log("测试垃圾回收", testGcValue);
  };

  return (
    <>
      <Button onClick={testGc}>测试垃圾回收</Button>
</>

先点击GC,勾选memory,再点击录制按钮(如果对Performance不熟悉可阅读上面的文章):

image

然后点击三次‘测试垃圾回收按钮’,你会发现内存是这样的:

image

内存占用有三次增长,因为我们点击三次按钮的时候会创建 3 次大数组。

但是最后我们手动 GC 之后并没有回落下去,也就是这个大数组没有被回收。

按理来说,代码执行完,那用的内存就要被释放,然后再执行别的代码,结果这段代码执行完之后大数组依然占据着内存,这样别的代码再执行的时候可用内存就少了。这就是发生了内存泄漏,也就是代码执行完了不释放内存的流氓行为。

接下来我们注释了con现在的内存分配情况是这样的sole.log的部分,然后重复上述操作

现在的内存分配情况是这样的:

image

分配了三次内存,但是 GC 后又会落下去了。

这才是没有内存泄漏的好代码。

那为啥 console.log 会导致内存泄漏呢?

结论

因为控制台打印的对象,你是不是有可能展开看?那如果这个对象在内存中没有了,是不是就看不到了?

所以有这个引用在,浏览器不会把你打印的对象的内存释放掉。

当然,也不只是 console.log 会导致内存泄漏,还有别的 4 种情况:

  • 定时器用完了没有清除,那每次执行都会多一个定时器的内存占用,这就是内存泄漏

  • 元素从 dom 移除了,但是还有一个变量引用着他,这样的游离的 dom 元素也不会被回收。每执行一次代码,就会多出游离的 dom 元素的内存,这也是内存泄漏

  • 闭包引用了某个变量,这个变量不会被回收,如果这样的闭包比较多,那每次执行都会多出这些被引用变量的内存占用。这样引用大对象的闭包多了之后,也会导致内存问题

  • 全局变量,这个本来就不会被 GC,要注意全局变量的使用

总之,全局变量、闭包引用的变量、被移除的 dom 依然被引用、定时器用完了没清除、console.log 都会发生代码执行完了,但是还占用着一部分内存的流氓行为,也就是内存泄漏。

注意,这里指的是使用完毕后没有回收,在使用期间的内存增长是正常的。

排查

如何排查是哪里代码造成的

1.Performance

点击内存分配的点,跳转到对应的目录

image

image

这样就定位到了分配内存的代码,分析一下哪里会有问题即可。

当然,前提还是要执行先 GC,再做一些操作,再 GC 的这个流程。

这是从代码角度来分析内存泄漏

2.Memory

切换到Memory那个Tab,先 GC,录制一次内存快照,再点击几次按钮,然后 GC,再录制一次内存快照。

流程和用 performance 分析的时候一样。

拿到两次内存快照也是可以分析出有内存泄漏的:

image

可以看到 GC 后内存占用依然增长了。

快照记录着这个时刻内存中所有对象的状态:

切换到对比,这时候可以看到最大的内存增长是 array 对象,然后就可以从 array 的角度去思考是什么导致的内存泄漏了:

image

此外,memory 还有实时分析的工具:

image

在没有console.log连续点击测试垃圾回收,可以看到到达最高后是会自动回落
image

而在有console.log的情况下可以涨到500M+

image

点击停止后,可以看到每次内存分配的对象

image

总结

我们可以利用Performance和Memory来分析内存泄漏,对于console.log带来的可以通过vscode logpoint 来代替 console.log ,具体可以看上述文章

标签:泄漏,console,log,点击,GC,内存,Memory,Performance
From: https://www.cnblogs.com/leise/p/17035684.html

相关文章

  • linux 内存空间(三) 内存地址范围和例子
    先放一张虚拟地址空间分布图(图截至深入理解计算机系统第三版):对于这张图有好多种不同的画法和呈现方式。       通过上面这几张图,我们应该清晰认识到linux......
  • [c++实践]内存对齐与伪共享
    内存对齐与伪共享时间测试类该类会在后续的测试中用于运行时间测试。//public/timer.h#include<chrono>#include<iostream>#include<functional>structScopeTimer{......
  • Java内存区域有哪些构成?
    目录前言Java内存区域程序计数器虚拟机栈本地方法栈堆方法区字符串常量池运行时常量池直接内存小结作者:小牛呼噜噜|https://xiaoniuhululu.com计算机内功、JAVA底层......
  • linux 内存管理(一)---基本概念
    最近项目上遇到一个问题,协议栈运行一个多小时后,就会出现延迟几ms的现象,经过反复测试和用ftrace查看,最后确认是在一个多小时候出现了do_mem_abort,然后去调用缺页异常,但是处......
  • linux中大页内存
    在项目中遇到缺页中断引发了延迟,后来在网上查找,发现有两种手段可以来介绍缺页中断的发生:1:减少mmap的使用,改用brk这个只是在一定程度上减少用户态和内核态的切换,减少对内......
  • Qt获取内存信息
    原文地址:https://blog.csdn.net/Joker__123/article/details/125064795intMB=1024*1024;MEMORYSTATUSEXmemoryStateEx;memoryStateEx.dwLength......
  • # CS:APP--Chapter05 : optimizing program performance (part 1)
    CS:APP--Chapter05:optimizingprogramperformance(part1)目录CS:APP--Chapter05:optimizingprogramperformance(part1)prologue1.capabilitiesandlimitati......
  • C语言学习--动态内存分配(未完待续)
    内存分配的类型:在C/C++中内存分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区。静态内存分配:编译时分配。包括:全局、静态全局、静态局部三种变量。......
  • jmap——Java内存分析工具
    jmap是JDK自带的监控工具,在JDK的根目录中可以找到。主要用来查看Java进程对内存的使用情况1、查看类列表,包含实例数、占用内存大小#pid是进程IDjmap-histo:livepid......
  • 碎冰挂船与按键精灵读内存地址
    昨天使用古老的按键精灵写个脚本,用来给老叶的海盗王挂船熟,每隔一个小时都要补一次船实在太麻烦了。好吧,古老的游戏,和古老的工具。一般很少上游戏了,也不想打装备,不想升级装......