1. 程式人生 > >JavaScript棧記憶體和堆記憶體區別

JavaScript棧記憶體和堆記憶體區別

和棧這兩個字我們已經接觸多很多次,那麼具體是什麼存在棧中什麼存在堆中呢?就拿JavaScript中的變數來說:
首先JavaScript中的變數分為基本型別和引用型別。
基本型別就是儲存在棧記憶體中的簡單資料段,而引用型別指的是那些儲存在堆記憶體中的物件。

1、基本型別
基本型別有Undefined、Null、Boolean、Number 和String。這些型別在記憶體中分別佔有固定大小的空間,他們的值儲存在棧空間,我們通過按值來訪問的。

2、引用型別
引用型別,值大小不固定,棧記憶體中存放地址指向堆記憶體中的物件。是按引用訪問的。

如下圖所示:棧記憶體中存放的只是該物件的訪問地址,在堆記憶體中為這個值分配空間。由於這種值的大小不固定,因此不能把它們儲存到棧記憶體中。但記憶體地址大小的固定的,因此可以將記憶體地址儲存在棧記憶體中。 這樣,當查詢引用型別的變數時, 先從棧中讀取記憶體地址, 然後再通過地址找到堆中的值。對於這種,我們把它叫做按引用訪問。
這裡寫圖片描述
其他語言中的記憶體分配類似。

為什麼會有棧記憶體和堆記憶體之分?
通常與垃圾回收機制有關。為了使程式執行時佔用的記憶體最小。
當一個方法執行時,每個方法都會建立自己的記憶體棧,在這個方法內定義的變數將會逐個放入這塊棧記憶體裡,隨著方法的執行結束,這個方法的記憶體棧也將自然銷燬了。因此,所有在方法中定義的變數都是放在棧記憶體中的;
當我們在程式中建立一個物件時,這個物件將被儲存到執行時資料區中,以便反覆利用(因為物件的建立成本通常較大),這個執行時資料區就是堆記憶體。堆記憶體中的物件不會隨方法的結束而銷燬,即使方法結束後,這個物件還可能被另一個引用變數所引用(方法的引數傳遞時很常見),則這個物件依然不會被銷燬,只有當一個物件沒有任何引用變數引用它時,系統的垃圾回收機制才會在核實的時候回收它。

相關推薦

JavaScript記憶體記憶體區別

和棧這兩個字我們已經接觸多很多次,那麼具體是什麼存在棧中什麼存在堆中呢?就拿JavaScript中的變數來說: 首先JavaScript中的變數分為基本型別和引用型別。

C++學習--------------記憶體記憶體區別

資料結構中的堆與棧: 棧:是一種連續儲存的資料結構,具有先進後出的性質。通常的操作有入棧(圧棧)、出棧和棧頂元素。想要讀取棧中的某個元素,就要將其之前的所有元素出棧才能完成。類比現實中的箱子一樣。 堆:是一種非連續的樹形儲存資料結構,每個節點有一個值,整棵樹是經過排序的。特點是根結

記憶體記憶體區別(一個筆試題的一部分)

筆試題目:請解釋一個棧記憶體與一個堆記憶體的區別,請分析下面程式碼執行是否有問題,如果有問題請改正。 char* GetMemory(void) {      char p[] = "Hello world";      return p; } void main(void

js記憶體記憶體區別

首先JavaScript中的變數分為基本型別和引用型別。基本型別就是儲存在棧記憶體中的簡單資料段,而引用型別指的是那些儲存在堆記憶體中的物件。 1、基本型別 基本型別有Undefined、Null、Boolean、Number 和String。這些型別在記憶體中分

js記憶體記憶體與垃圾回收機制

v8作為javascirpt引擎,對變數的儲存主要有兩種位置:棧儲存和堆儲存 棧記憶體儲存基本型別的變數:如Number,String,boolen,undefined,null,以及對物件和陣列變數的指標,物件是動態分配記憶體,陣列的初始化方式分為: 動態初始化:初始化

java 記憶體 記憶體的涵義及使用範圍

class FunctionDemo {     /*陣列記憶體空間的區域劃分\     1、暫存器     2、本地方法區     3、方法區     4、棧記憶體         //棧記憶體的涵義:         1、儲存的區域性變數  ----區域性變數對應的

直接記憶體記憶體區別

同樣是在按Java工程師成神之路的學習過程中學到的。 定義 直接記憶體:NIO的Buffer提供了一個可以不經過JVM記憶體直接訪問系統實體記憶體的類——DirectBuffer。 DirectBuffer類繼承自ByteBuffer,但和普通的Byt

js中的記憶體記憶體

1.簡介棧和堆 棧:棧會自動分配記憶體空間,實體記憶體是連續的,存放基本型別,簡單的資料段,        佔據固定大小的空間。            基本型別:String,Number,Boo

為什麼要有記憶體記憶體之分

 在看jvm原理的時候,經常會聽到堆疊,但對其概念默默糊糊,只知道棧是先進後出的資料結構(FILO),而堆是樹的一種特例。堆的特點是子節點都比父節點要小,堆用於動態建立分配記憶體,建立和刪除節點的時間

【Big Data 每日一題20181111】為什麼有記憶體記憶體之分

為什麼有棧記憶體和堆記憶體之分?         陣列引用變數只是一個引用,這個引用變數可以指向任何有效的記憶體,只有當該引用指向有效記憶體,才可以通過該陣列變數來訪問陣列。        實際的陣列物件被儲存在堆(heap)記憶體中;如果引用該陣列物件引用變數是一個區域

Java直接記憶體記憶體的效能比較

在JDK 1.4中新加入了NIO(New Input/Output)類,引入了一種基於通道(Channel)與緩衝區(Buffer)的I/O方式, 它可以使用Native函式庫直接分配堆外記憶體,然後通過一個儲存在Java堆裡面的DirectByteBuffer物件作為

Java中的記憶體分配以及區別

Java中的記憶體分配以及棧和堆的區別 (1)棧: 存放的是區域性變數 區域性變數:在方法定義中或者方法宣告上的變數都是區域性變數。 (2)堆: 存放的是所有new出來的東西 特點: a: 每一個new出來的東西都會為其分配一個地制值。 b: 每

【轉載】 記憶體分配的區別

本文轉自 http://www.jb51.net/article/40513.htm   一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到記憶體一會在棧上分配,一會又在堆上分配,那麼它們之間到底是怎麼的區別呢?為了說明這個問題,我們先來看一下記憶體內部的組織情況。 從

OC中記憶體區別解析

記憶體管理 移動裝置的記憶體及其有限,每一個APP所能佔用的記憶體是有限制的 什麼行為會增加APP的記憶體佔用 建立一個oc物件定義一個變數呼叫一個函式或者方法 記憶體管理範圍 任何繼承了NSO

java記憶體分配(區別聯絡)

Java 把記憶體劃分成兩種:一種是棧記憶體,另一種是堆記憶體。在函式中定義的一些基本型別的變數和物件的引用變數都是在函式的棧記憶體中分配,當在一段程式碼塊定義一個變數時,Java 就在棧中為這個變數分配記憶體空間,當超過變數的作用域後,Java 會自動釋放掉為該變數分配的記

作用域記憶體區別

  作用域是函式執行的時候產生fn() 函式執行的時候首先會開闢一個新的記憶體空間叫棧記憶體(環境或作用域) 資料型別在賦值的時候會開闢一個新的記憶體空間叫堆記憶體(存放程式碼塊的) 二者都會形成一個記憶體地址 生成物件的單例模式 優勢,每個物件都是獨立的,即便屬性起的名字一樣,不會相互

記憶體記憶體在資料共享方面的區別

D.false true對於這道題,考察的是對String型別的認識以及編譯器優化。Java中String不是基本型別,但是有些時候和基本型別差不多,如String b =  "tao" ; 可以對變數直接賦值,而不用 new 一個物件(當然也可以用 new)。所以String這個型別值得好好研

javascript記憶體記憶體淺談

首先,我們來舉個爪子: var m = 1; var n = m; n=2; console.log(m); 大家覺得答案是什麼?是一的情自覺點贊,不開玩笑了,其實這個很簡單,對吧。那麼我們再來一

JavaScript 資料結構與演算法之美 - 記憶體記憶體 、淺拷貝與深拷貝

前言 想寫好前端,先練好內功。 棧記憶體與堆記憶體 、淺拷貝與深拷貝,可以說是前端程式設計師的內功,要知其然,知其所以然。 筆者寫的 JavaScript 資料結構與演算法之美 系列用的語言是 JavaScript ,旨在入門資料結構與演算法和方便以後複習。 棧 定義 後進者先出,先進者後出,簡

愛創課堂每日一題第二十六天-2017/9/28 區別

前端 前端學習 前端入門棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。堆(數據結構):堆可以被看成是一棵樹,如:堆排序;棧(數據結構):一種先進後出的數據結構。愛