☞ 堆是無序的,是一片不連續的內存域,由用戶本身來控制和釋放,若是用戶本身不釋放的話,當內存達到必定的特定值時或程序運行結束時,經過垃圾回收器(GC)來回收。html
☞ 是程序運行期間動態分配的內存空間,你能夠根據程序的運行狀況肯定要分配的堆內存的大小。post
☞ 棧是有順序的,是一片連續的內存域,保持着先進後出的原則,由系統自動分配和維護。url
☞ 是編譯期間就分配好的內存空間,所以代碼中必須就棧的大小有明確的定義。spa
即, 所分配的內存是在一塊連續的內存區域內.當咱們聲明變量時,那麼編譯器會自動接着當前棧區的結尾來分配內存。.net
☞ 值類型變量聲明後,不管是否已經賦值,編譯器都會爲其分配內存。線程
☞ 引用類型當聲明一個類時,只會在棧中分配一小塊內存用於存放引用地址,此時並無爲其分配堆上的空間。當類實例化時,分配內存空間,並把堆上空間的地址保存到棧上分配的小塊空間中。3d
☞ 值類型的實例一般是在線程棧上分配的(靜態分配),可是在某些情形下能夠存儲在堆中。htm
☞ 引用類型的對象老是在進程堆中分配(動態分配)。對象
運行結果blog
從圖中咱們能夠看出,兩個引用類型sc1,sc2都指向同一個託管堆上的空間,因此最後一個指向的會覆蓋掉前面的。
而結構是值類型,雖然使用sv2=sv1,把sv1對象賦值給sv2,可是它會在線程棧中分配一個獨立的空間,當修改某一個對象的值的時候,不會影響到另外一個對象
因此,值類型和引用類型的區別就是:
一、它們存儲的位置不同
二、若是是引用類型,當兩個對象指向同一個地方,修改某一個的時候,其它對象的值會發生改變
內容參考來自文章:
做者:遙遠的Ta