JavaScript中的内存空间

本文主要介绍JavaScript中内存空间

JavaScript没有严格意义上,区分堆与栈,所有可以理解为JavaScript所有的数据都是存放在堆内存中,但是大部分时候我们还是需要借助堆栈来理解。

堆与栈

栈由操作系统自动分配释放 ,用于存放函数的参数值、局部变量等,栈数据结构的一个特点就是后进先出。
堆由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收,分配方式类似于链表,堆数据结构类似于JSON对象中的key-value。

基本数据类型和引用数据类型

JavaScript中的数据类型分为:基本数据类型与引用数据类型
基本数据类型都是存放在栈内存中
引用数据类型都是存放在堆内存中,javascript是不允许直接访问堆内存中的数据,所以如果我们要访问引用数据类型的时候,采用的是按引用访问,就是在变量对象中存放了一个指向对象的地址,要访问堆内存中的对象,就要通过这个引用地址来访问
所以,在堆JavaScript变量进行拷贝时,基本数据类型相当于复制了一份数据,而引入数据类型只是复制了一个地址,其引用的对象依然没有发生变化

内存泄漏

内存泄漏:就是不再用到的内存,但是没有及时释放,就叫做内存泄漏,严重时将会导致进程崩溃
有些语言必须手动释放内存,程序员负责内存的管理,例如C语言,而JavaScript中是依靠垃圾回收机制来管理的

垃圾回收机制

垃圾回收机制的原理就是,使用引用计数法,就是记录内存中资源的引用次数,当内存中的某块资源的被引用次数为0,垃圾回收机制就会把这块资源释放掉
但再实际情况中,有些资源我们已经不在需要,但他的引用次数缺不为0(也就是依然被其他变量所引用),这时候,垃圾回收机制就不会对它进行回收(例如闭包)

避免内存泄漏

在局部作用域中,等函数执行完毕,变量就没有存在的必要了,js垃圾回收机制很快做出判断并且回收,但是对于全局变量,很难判断什么时候不用,所以,应该尽量少使用全局变量。
我们在使用闭包的时候,就会造成严重的内存泄漏,因为闭包的原因,局部变量会一直保存在内存中,所以在使用闭包的时候,要慎重。

扫一扫,请老师喝水