當前位置:
首頁 > 知識 > 堆、棧、方法區、常量池面試遇到怎麼答?

堆、棧、方法區、常量池面試遇到怎麼答?

結構化語言里函數(子程序)調用最方便的實現方式就是用棧,以至於現在絕大部分晶元都對棧提供晶元級的硬體支持,一條指令即可搞定棧的pop操作。

棧的好處是:方便、快、有效避免內存碎片化。棧的問題是:不利於管理大內存(尤其在16位和32位時代)、數據的生命周期難於控制(棧內的有效數據通常是連續存儲的,所以pop時後申請的內存必須早於先申請的內存失效),所以棧不利於動態地管理並且有效地利用寶貴的內存資源。於是有了堆

JAVA的JVM的內存可分為3個區:堆(heap)、棧(stack)和方法區(method)也叫靜態存儲區。

堆區:

1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)

2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身

棧區:

1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中

2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。

3.棧分為3個部分:基本類型變數區、執行環境上下文、操作指令區(存放操作指令)。

方法區:

1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變數。

2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變數。

堆和棧的區別可以用如下的比喻來看出:

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就

走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自

由度小。

使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由

度大。

方法區: 用於儲存已被虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據。

垃圾收集行為在方法區很少出現,這塊區域回收的主要目標是針對常量池的回收和對類型的卸載

運行時常量池:

方法區的一部分

常量池用於存放編譯期生成的各種字面量和符號引用(還有翻譯出來的直接引用),這部分內容在類載入後進入方法 區的運行時常量池中存放。

運行時常量池相對於Class文件常量池的另一個重要特徵是具備動態性,運行期間也可能將新的常量放入池中

String str = "abc"創建對象的過程

1 首先在常量池中查找是否存在內容為"abc"字元串對象

2 如果不存在則在常量池中創建"abc",並讓str引用該對象

3 如果存在則直接讓str引用該對象

(2)String str = new String("abc")創建實例的過程

1 首先在堆中(不是常量池)創建一個指定的對象"abc",並讓str引用指向該對象

2 在字元串常量池中查看,是否存在內容為"abc"字元串對象

3 若存在,則將new出來的字元串對象與字元串常量池中的對象聯繫起來

4 若不存在,則在字元串常量池中創建一個內容為"abc"的字元串對象,並將堆中的對象與之聯繫起來

String str1 = "abc"; String str2 = "ab" + "c"; str1==str2是ture

是因為String str2 = "ab" + "c"會查找常量池中時候存在內容為"abc"字元串對象,如存在則直接讓str2引用該對象,顯然String str1 = "abc"的 時候,上面說了,會在常量池中創建"abc"對象,所以str1引用該對象,str2也引用該對象,所以str1==str2

String str1 = "abc"; String str2 = "ab"; String str3 = str2 + "c"; str1==str3是false ---------//可參考Java編程思想第四版P284,285

是因為String str3 = str2 + "c"涉及到變數(不全是常量)的相加,所以會生成新的對象,其內部實現是先new一個StringBuilder,然後 appe nd(str2),append("c");然後讓str3引用toString()返回的對象

問:String s = new String(「abc」); 產生幾個對象?

答:一個或兩個,如果常量池中原來沒有 」abc」, 就是兩個(參考棧中的數據共享)。

堆、棧、方法區、常量池面試遇到怎麼答?

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

IDEA的實用插件
RabbitMQ之消息確認機制(事務+Confirm)

TAG:程序員小新人學習 |