第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java中棧內存是如何訪問的

Java中棧內存是如何訪問的

DIEA 2023-05-10 17:34:08
我試圖了解 Java 堆棧和堆內存。通過閱讀不同的資料,我得出以下結論:本地(方法的一部分)聲明的基本類型如 int、bytes、char 等存儲在堆棧中。而靜態(tài)和實例(對象實例或類的一部分)原始類型存儲在堆上。簡而言之,局部變量存儲在棧上,而實例和靜態(tài)變量則存儲在堆上。本地引用對象將在堆中創(chuàng)建,而變量將在堆棧中創(chuàng)建。實例/靜態(tài)引用對象將在堆中創(chuàng)建變量和對象。(例如,一個本地的,將在堆棧中car ferrari = new car()創(chuàng)建一個內存,而實際對象將在堆中。ferrari堆棧變量ferrari將具有實際對象的堆位置的引用地址)。但是在進一步閱讀時,我讀到在堆棧中內存被分配到前一幀的頂部。這讓我對以下情況感到困惑:問題一:讓我的方法是:calculate(){int a=15;int b=25;return a+b;}但根據(jù)堆棧,后入將是 b。所以 a 的值將超出范圍,直到從堆棧中使用 b 的值。程序如何能夠在 'b' 之前使用 'a' 的值?對于操作a+b。問題2:讓我的方法是:calculate(){int a=15;int b=25;int z= a+b;int y=a+b;return y;}現(xiàn)在我已經(jīng)使用變量 a 和 b 來計算'z',變量 y 是如何能夠再次訪問 a 和 b 的,因為它已經(jīng)從堆棧中使用了。我不是Java專家,如果有人能用簡單的語言解釋一下,我將非常感謝。
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻2036條經(jīng)驗 獲得超8個贊

每個線程都有自己的堆棧。


每當一個線程調用一個方法時,都會在堆棧內存中為該方法創(chuàng)建一個新塊來保存本地原始值和對該方法中其他對象的引用。這個內存塊稱為棧幀。一旦方法結束,該塊將變?yōu)槲词褂脿顟B(tài),并將其從堆棧頂部移除。這是因為堆棧內存始終以 LIFO(后進先出)順序引用。


所以,如果你有代碼:


void go(){

   int x = 1;

   foo(x);

}


void foo(int y){

   int z = y;

   bar();

}


void bar(){

   Hello h = new Hello();

}

堆??雌饋硐襁@樣:

http://img1.sycdn.imooc.com//645b653900012f6d01660152.jpg

只有這張圖片h在范圍內。但是在bar()方法完成后,變量y和 都z將在范圍內。

在內部,stack 包含局部變量 array和 操作數(shù) stack。

在局部變量數(shù)組中存儲了方法的參數(shù)和該堆棧幀的所有局部變量。此外,如果堆棧幀表示實例方法,則局部變量數(shù)組的位置0將是this指向堆上對象的引用。如果方法static在位置上,則該位置0將是方法的第一個參數(shù)。局部變量數(shù)組的大小在編譯時確定。要查看局部變量數(shù)組,您需要查看已編譯的 Java 代碼。對于您的第一種calculate()方法(以防萬一static),局部變量數(shù)組將如下所示:

http://img1.sycdn.imooc.com//645b6543000109cd03240068.jpg

您可以看到變量名稱(Name列)與其在數(shù)組中的位置(Slot列)之間的關系。

操作數(shù)棧是用于對局部變量數(shù)組中的變量進行操作的棧。在操作數(shù)堆棧上是來自局部變量數(shù)組的變量,在您的示例中,添加并分配給其他變量,這些變量再次保存在局部變量數(shù)組中。

問題 1: 程序如何使用abefore的值b進行操作a + b

因為有pop操作讀取然后從堆棧中刪除值。要添加這兩個值,您需要從操作數(shù)堆棧 (value b) 中彈出(讀取并刪除)最后一個值。a現(xiàn)在是操作數(shù)棧頂部的值。彈出(讀取并刪除)這個值(操作數(shù)堆棧現(xiàn)在為空)并添加這兩個值。將結果放回操作數(shù)棧。操作數(shù)?,F(xiàn)在只包含結果。

詳細說明:
當您調用calculate()新的堆??蚣軙r,它會被創(chuàng)建并放在堆棧的頂部。語句int a = 15;在內部分為 2 個步驟:

  1. 常量15放在操作數(shù)棧的頂部,

  2. 彈出(讀取并刪除)操作數(shù)堆棧中的值(這是常量15)并將其保存在特定索引處的局部變量數(shù)組中。

對 重復相同的步驟int b = 25;?,F(xiàn)在您有 2 個值保存在局部變量數(shù)組和空操作數(shù)堆棧中。最后一部分return a + b;通過 4 個步驟完成:

  1. a將局部變量數(shù)組中的值推送(加載)到操作數(shù)堆棧,

  2. b將值從局部變量數(shù)組推入(加載)到操作數(shù)堆?!,F(xiàn)在您在操作數(shù)堆棧上有兩個值。

  3. 從操作數(shù)堆棧中彈出(讀取并刪除)第一個值(這是b值)。從操作數(shù)堆棧彈出第二個值(這是a值)。此時操作數(shù)棧是空的。將這兩個值相加并將結果推回操作數(shù)堆棧?,F(xiàn)在操作數(shù)棧只包含加法運算的結果。

  4. 從操作數(shù)棧中彈出值并將其返回給調用此方法的任何人?,F(xiàn)在操作數(shù)棧是空的。

此時,由于方法已完成,棧幀從棧中移除。

問題 2: 現(xiàn)在我已經(jīng)使用了變量ab計算z,變量如何y能夠訪問ab再次使用,因為它已經(jīng)從堆棧中使用了?

因為棧幀中有一個局部變量數(shù)組,它存儲了該棧幀中定義的所有局部變量。

詳細說明:
int a = 15int b = 25Q1一樣。int z = a + b;是這樣執(zhí)行的:

  1. a將局部變量數(shù)組中的值推送(加載)到操作數(shù)堆棧,

  2. b將值從局部變量數(shù)組推入(加載)到操作數(shù)堆棧?,F(xiàn)在您在操作數(shù)堆棧上有兩個值。

  3. 從操作數(shù)堆棧中彈出(讀取并刪除)第一個值(這是b值)。從操作數(shù)堆棧彈出第二個值(這是a值)。此時操作數(shù)棧是空的。將這兩個值相加并將結果放入操作數(shù)堆棧?,F(xiàn)在操作數(shù)棧只包含加法運算的結果。

  4. 彈出(讀取并刪除)操作數(shù)堆棧(結果)中的值a + b并將其保存在特定索引處的局部變量數(shù)組中。

int y = a + b;以與 相同的方式執(zhí)行int z = a + b;

最后一部分return y

  1. y值從局部變量數(shù)組壓入操作數(shù)棧,

  2. 從操作數(shù)棧中彈出值并將其返回給調用此方法的任何人。操作數(shù)?,F(xiàn)在是空的。

因為方法已經(jīng)完成,棧幀從棧中移除。

請注意,有堆棧,它包含在多個堆棧幀中,而且在每個堆棧幀內,您都有用于該堆棧幀內操作的操作數(shù)堆棧。


查看完整回答
反對 回復 2023-05-10
  • 1 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號