JVM:堆与栈的比较
堆(heap)與棧(stack)
??? 堆和棧是程序運行的關鍵,很有必要它他們的關系說清楚。
? ? 在java中,Main函數就是棧的起始點,也是程序的起始點。程序要運行總是有一個起點的(程序執行的入口)。
概括: ??
?1 ?棧是運行時的單位 ,?而堆是存儲的單元。
?2? 棧解決程序的運行問題,即程序如何執行,或者說如何處理數據,
? ? 堆解決的是數據存儲的問題,即數據怎么放,放在哪兒。
在java中一個線程就會相應有一個線程棧與之對應,這點很容易理解,因為不同的線程執行邏輯有所不同,因此需要一個獨立的線程棧。
而堆則是所有線程共享的。
? ?
?疑問一:為什么要把堆和棧區分出來呢?棧中不是也可以存儲數據嗎?
???? 1. 從軟件設計的角度看,棧代表了處理邏輯,而堆代表了數據。這樣分開,使得處理邏輯更為清晰。分而治之的思想。
? ? ? ? 這種隔離、模塊化的思想在軟件設計的方方面面都有體現。
???? 2.堆與棧的分離,使得堆中的內容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)。
? ? ? ? 好處: ?a.提供了一種有效的數據交互方式(如:共享內存)
? ? ?? ? ? ? ? ?b.堆中的共享常量和緩存可以被所有棧訪問,節省了空間。
???? 3. 棧因為運行時的需要,比如保存系統運行的上下文,需要進行地址段的劃分。
? ? ? ? 由于棧只能向上增長,因此就會限制住棧存儲內容的能力,
? ? ? ? 而堆不同,堆中的對象是可以根據需要動態增長的,
? ? ? ? 因此棧和堆的拆分使得動態增長成為可能,相應棧中只需記錄堆中的一個地址即可。
???? 4.?面向對象就是堆和棧的完美結合。
? ? ? ? 其實,面向對象方式的程序與以前結構化的程序在執行上沒有任何區別。
? ? ? ? 但是,面向對象的引入,使得對待問題的思考方式發生了改變,而更接近于自然方式的思考。
? ? ? ? 當我們把對象拆開,你會發現,對象的屬性其實就是數據,存放在堆中;
? ? ?? 而對象的行為(方法),就是運行邏輯,放在棧中。
? ? ? ? 我們在編寫對象的時候,其實就是編寫了數據結構,也編寫了處理數據的邏輯。不得不承認,面向對象的設計,確實很美。
?疑問二:??堆中存什么?棧中存什么?
? ? ? 1. 棧存儲的信息都是跟當前線程(或程序)相關的信息。(局部變量(局部變量表)、程序運行狀態(操作數棧)、方法(動態連接)、方法返回值(方法返回地址))等,
? ? ? ? ?棧中存的是基本數據類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態變化的,但是
? ? ? ? ?在棧中,一個對象只對應了一個4byte的引用(堆棧分離的好處)。
? ? ?2. 堆只負責存儲對象信息。
?疑問三:? 為什么不把基本類型放堆中呢?
? ? ?1. 其占用的空間一般是1~8個字節---需要空間比較少,
? ? ?2.而且因為是基本類型,所以不會出現動態增長的情況---長度固定,因此棧中存儲就夠了,如果把它存在堆中是沒有什么意義的(還會浪費空間,后面說明??)。
總結
以上是生活随笔為你收集整理的JVM:堆与栈的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM:gc什么时候开始?System.
- 下一篇: 一个例子理解什么是RPC?