Java棧記憶體和對記憶體的區別

2021-06-25 14:15:39 字數 1339 閱讀 6964

棧記憶體:

在函式中定義的一些基本型別的變數和物件的引用變數都在函式的棧記憶體中分配。 棧記憶體主要存放的是基本型別型別的資料 如、( int, short, long, byte, float, double, boolean, char) 和物件控制代碼。並沒有有string基本型別、在棧記憶體的資料的大小及生存週期是必須確定的、其優點是寄存速度快、、棧資料可以共享、缺點是資料固定、不夠靈活。

棧的共享:

string a = "abc";

string b = "abc";

system.out.println(a==b);

結果為true 這就說明了a b其實指向同乙個值

注意,我們這裡並不用a.equals(b);的方式,因為這將比較兩個字串的值是否相等。==號,根據jdk的說明,只有在兩個引用都指向了同乙個物件時才返回真值。而我們在這裡要看的是,a與b是否都指向了同乙個物件。

結果說明,jvm建立了兩個引用a和b,但只建立了乙個物件,而且兩個引用都指向了這個物件。

首先它會在棧中建立乙個變數為a的引用,然後查詢棧中是否有abc這個值,如果沒找到,就將abc存放進來,然後將a指向abc。接著處理string b = "abc";在建立完b的引用變數後,因為在棧中已經有abc這個值,便將b直接指向abc。這樣,就出現了a與b同時指向abc

特別注意的是,這種字面值的引用與類物件的引用不同。假定兩個類物件的引用同時指向乙個物件,如果乙個物件引用變數修改了這個物件的內部狀態,那麼另乙個物件引用變數也即刻反映出這個變化。相反,通過字面值的引用來修改其值,不會導致另乙個指向此字面值的引用的值也跟著改變的情況。如上例,我們定義完a與b的值後,再令a=abcd;那麼,b不會等於abcd,還是等於abc。在編譯器內部,遇到a= abcd;時,它就會重新搜尋棧中是否有abcd的字面值,如果沒有,重新開闢位址存放abcd的值;如果已經有了,則直接將a指向這個位址。因此a值的改變不會影響到b的值。

堆記憶體:

堆記憶體用來存放所有new 建立的物件和 陣列的資料、

string a = new string ("abc");

string b = "abc";

system.out.println(a==b); //false

string a = new string ("abc");

string b = new string ("abc");

system.out.println(a==b); //false

建立了兩個引用。建立了兩個物件。兩個引用分別指向不同的兩個物件。以上兩段**說明,只要是用new()來新建物件的,都會在堆中建立,而且其字串是單獨存值的,即使與棧中的資料相同,也不會與棧中的資料共享。

java裡的堆記憶體於棧記憶體的區別

這個區別對於我們來說並不大,這是記憶體分配的兩種方法。一般 邏輯,簡單變數,結構體都是放入棧中,而物件,以及被裝箱的資料是放入堆中的。簡單來說,棧就是乙個很長的棧 資料結構中的棧,如果不理解可以當做是像線一樣的一長串資料 裡面存著各種邏輯,以及像整形,浮點型等資料,根據棧先進先出的原則,會一條條被執...

個人對記憶體洩漏和記憶體溢位的理解

記憶體洩漏 從語義上講就是記憶體外露了的部分,跟傷口一樣,那麼就被細菌覆蓋,我們要及時把它 就應該去除細菌貼上邦迪,把傷口藏起來,就相當於釋放記憶體,讓壞蟲子走開,不讓它們占有不該占有的東西。編完了,來看下實際解釋 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記憶...

記憶體堆和棧的區別

在計算機領域,堆疊是乙個不容忽視的概念,我們編寫的c語言程式基本上都要用到。但對於很多的初學著來說,堆疊是乙個很模糊的概念。堆疊 一種資料結構 乙個在程式執行時用於存放的地方,這可能是很多初學者的認識,因為我曾經就是這麼想的和組合語言中的堆疊一詞混為一談。我身邊的一些程式設計的朋友以及在網上看帖遇到...