当前位置:首页 > 内存 > 正文

js内存泄漏的几种情况(内存溢出与内存泄漏的区别)

  • 内存
  • 2024-06-05 21:58:12
  • 10000

一、JS内存泄漏与垃圾回收机制

内存生命周期:

程序执行需要内存。只要程序请求,操作系统或操作系统就必须提供内存。

对于持续运行的服务进程,必须按时释放内存。否则,内存使用率会越来越高,轻则影响系统性能,重则导致进程崩溃。

内存泄漏案例:全局变量、未销毁的定时器和回调函数(setInterval)、闭包(外部函数中的变量被引用且无法释放)、DOM引用(元素被移除,但仍有引用)elements)

识别不必要的变量有两种方法:标记扫描法和引用计数法。

当变量进入环境时,该变量被标记为“进入环境”,当变量离开环境时,被标记为“离开环境”。

您可以使用“进入环境”的变量列表和“离开环境”的变量列表来跟踪变量变化。您还可以返回一个特殊位来记录变量何时进入和离开环境。。环境。

当声明一个变量并给该变量赋值一个引用类型的值时,该值的引用次数为1;如果将相同的值分配给另一个变量,则对该值的引用次数;次数增加1;如果包含对该值的引用的变量获得另一个值,则对该值的引用次数减1。当对该值的引用次数变为0时,可以回收其占用的内存空间。下次垃圾收集器运行时,引用计数为0的值占用的内存将被释放。

如何观察内存泄漏?

一般规则:如果连续五次垃圾回收后内存使用量每次都增加,则存在内存泄漏。这需要内存使用情况的实时可视化。

正如之前提到的,按时清除参考资料非常重要。然而,你记不起太多了。有时候一不小心忘记了就忘记了,所以内存泄漏的情况特别多。

创建新引用时,声明哪些引用必须手动清除,哪些引用可以忽略。当其他引用消失时,垃圾收集机制可以释放内存。这显着减轻了程序员的负担,因为他们只需要清除主要引用。


二、内存泄漏是编写代码时最不想要遇到的情况之一,为什么?

内存泄漏是编写代码时最不想遇到的情况之一。一旦遇到,就需要停止正在运行的程序或者程序根本不运行,找到错误,并进行修改,因为内存泄漏本身就是一种数据被分配了空间但最终没有被回收的现象。一旦程序到达末尾,它会提醒您有错误。以下是造成内存泄漏的几个原因。

1.单例static引起

单例static的不回收是内存泄漏最常见的原因,因为单例static本身的生命周期与应用程序的生命周期不同。循环是一样的。在漫长的使用过程中,单例仍然占用着对象引用开辟的空间,这会导致程序结束时出现内存泄漏。就好像我借了你的钱,你的一部分钱到了我手里,我答应在规定的时间内归还。但如果忘记了,就不会还钱,等到资金链断了,才最终想起来。起来吧。

2.内部类保存了外部类

如果是外部类生成的实例对象,则已经被内部类数据使用过。最终外部类不再使用,但是内部类仍然使用并且这块内存没有被释放,所以外部类不会被回收,这也是内存泄漏的一个原因。

3.库和协议的连接

当我们连接数据库或者连接网络时,我们需要使用数据进行传输。连接关闭后,该数据的使用将继续。停止,但直到结束,连接都没有关闭,这会导致大量对象无法回收,导致内存泄漏和应用程序崩溃和冻结。

4.变量定义域不合理

在使用变量的过程中,必须对变量的定义域进行约束。如果在使用过程中使用了变量本身的域,范围超出了要求的范围且不留空,就会发生内存泄漏。