新聞中心
js棧內(nèi)存和堆內(nèi)存的區(qū)別?
首先JavaScript中的變量分為基本類型和引用類型?;绢愋途褪潜4嬖跅?nèi)存中的簡(jiǎn)單數(shù)據(jù)段,而引用類型指的是那些保存在堆內(nèi)存中的對(duì)象。

1、基本類型
基本類型有Undefined、Null、Boolean、Number 和String。這些類型在內(nèi)存中分別占有固定大小的空間,他們的值保存在棧空間,我們通過按值來訪問的。
2、引用類型
引用類型,值大小不固定,棧內(nèi)存中存放地址指向堆內(nèi)存中的對(duì)象。是按引用訪問的。如下圖所示:棧內(nèi)存中存放的只是該對(duì)象的訪問地址,在堆內(nèi)存中為這個(gè)值分配空間。由于這種值的大小不固定,因此不能把它們保存到棧內(nèi)存中。但內(nèi)存地址大小的固定的,因此可以將內(nèi)存地址保存在棧內(nèi)存中。 這樣,當(dāng)查詢引用類型的變量時(shí), 先從棧中讀取內(nèi)存地址, 然后再通過地址找到堆中的值。對(duì)于這種,我們把它叫做按引用訪問當(dāng)我們看到一個(gè)變量類型是已知的,就分配在棧里面,比如INT,Double等。其他未知的類型,比如自定義的類型,因?yàn)橄到y(tǒng)不知道需要多大,所以程序自己申請(qǐng),這樣就分配在堆里面?;绢愋痛笮」潭?,引用類型大小不固定,分開存放使得程序運(yùn)行占用內(nèi)存最小。
js堆和棧的區(qū)別?
js堆和棧主要區(qū)別兩方面:
1、操作方式不同
棧由操作系統(tǒng)自動(dòng)分配和釋放,用于存放簡(jiǎn)單的數(shù)據(jù)段,占據(jù)固定大小的空間。
堆是自主分配和釋放,若不主動(dòng)釋放,程序結(jié)束時(shí)由第三方回收。
2、數(shù)據(jù)結(jié)構(gòu)不同
JavaScript通過數(shù)組的方式,模仿實(shí)現(xiàn)堆棧。
棧:棧是一種運(yùn)算受限的線性表,把新元素放到棧頂元素的上面,使之成為新的棧頂元素稱作進(jìn)棧、入棧。
堆:堆是優(yōu)先隊(duì)列,也就是說隊(duì)列中存在執(zhí)行時(shí)會(huì)根據(jù)優(yōu)先級(jí)找優(yōu)先度最高的先執(zhí)行。
一、 堆(heap)和棧(stack)
棧(stack)會(huì)自動(dòng)分配內(nèi)存空間,會(huì)自動(dòng)釋放。堆(heap)動(dòng)態(tài)分配的內(nèi)存,大小不定也不會(huì)自動(dòng)釋放。
二、 基本類型和引用類型
基本類型:簡(jiǎn)單的數(shù)據(jù)段,存放在棧內(nèi)存中,占據(jù)固定大小的空間。
引用類型:指那些可能由多個(gè)值構(gòu)成的對(duì)象,保存在堆內(nèi)存中,包含引用類型的變量實(shí)際上保存的不是變量本身,二十指向該對(duì)象的指針。
基本數(shù)據(jù)類型包括Undefined,String,Boolean,Null,Number
三、 傳值和傳址
從一個(gè)向另一個(gè)變量復(fù)制引用類型的值,復(fù)制的其實(shí)是指針,因此兩個(gè)變量最終指向同一個(gè)對(duì)象。即復(fù)制的是棧中的地址而不是堆中的對(duì)象。
從一個(gè)變量復(fù)向另一個(gè)變量復(fù)制基本類型的值,會(huì)創(chuàng)建這個(gè)值的副本。
js堆和棧存儲(chǔ)數(shù)據(jù)的區(qū)別?
1,js堆和棧存儲(chǔ)數(shù)據(jù)的區(qū)別在于它們的數(shù)據(jù)類型和存儲(chǔ)方式不同。
2,堆和棧是js中常見的兩種數(shù)據(jù)存儲(chǔ)方式,堆用于存儲(chǔ)復(fù)雜的數(shù)據(jù)類型,而棧用于存儲(chǔ)基本數(shù)據(jù)類型和函數(shù)的引用。
棧中的數(shù)據(jù)按照先進(jìn)后出的順序存儲(chǔ),而堆中的數(shù)據(jù)沒有順序之分,可以隨時(shí)讀寫。
由于堆是動(dòng)態(tài)分配的,它不需要提前定義大小,在需要的時(shí)候會(huì)分配出內(nèi)存來存儲(chǔ)數(shù)據(jù)。
3,在js中,通過棧和堆來存儲(chǔ)數(shù)據(jù),可以極大地節(jié)省內(nèi)存的使用。
在編寫代碼時(shí),我們應(yīng)該根據(jù)所需的數(shù)據(jù)類型和訪問方式,合理地選擇堆或棧來存儲(chǔ)數(shù)據(jù)。
同時(shí),我們還要注意內(nèi)存泄露等問題,防止浪費(fèi)內(nèi)存。
到此,以上就是小編對(duì)于java中棧內(nèi)存和堆內(nèi)存有什么區(qū)別嗎的問題就介紹到這了,希望這3點(diǎn)解答對(duì)大家有用。
分享標(biāo)題:Java中棧內(nèi)存和堆內(nèi)存有什么區(qū)別
本文來源:http://m.fisionsoft.com.cn/article/djhdcio.html


咨詢
建站咨詢
