Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【2021-07-20】理解JavaScript中的堆和栈 #11

Open
superDCH opened this issue Jul 20, 2021 · 1 comment
Open

【2021-07-20】理解JavaScript中的堆和栈 #11

superDCH opened this issue Jul 20, 2021 · 1 comment

Comments

@superDCH
Copy link
Owner

No description provided.

@superDCH
Copy link
Owner Author

说到堆栈,讲的就是内存的使用和分配了,与寄存器和硬盘的无关。
(一)堆
堆是动态分配内存,内存大小不一,也不会自动释放。

引用类型占用空间不固定,保存在堆中。

引用类型的指针是存在栈里的,指向堆内存中的对象,是按引用访问的。(由于引用类型值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。)

当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

(二)栈
栈是自动分配相对固定大小的内存空间,并由系统自动释放,被调用时通常处于存储空间中,调用后被立即释放。

基本类型占用空间固定,保存在栈中,
基本类型有Undefined、Null、Boolean、Number 、String和Symbol,我们通过按值来访问的。

当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant