自己談談對java堆和棧的理解

來源:互聯網
上載者:User

 

 最近看了幾篇關於java堆和棧的區別的幾個文章。自己對這兩個概念有了一定

了理解。
        其實java的堆和棧是一種記憶體資源。這裡提到了記憶體資源,順便說一

下其實java記憶體不僅僅是棧和堆。還有寄存器,常量池。
        java堆記憶體是一個運行時資料區域,可以動態分配記憶體的大小,生存

周期不必實現告訴編譯器,存放對象和數組,優點是動態分配具有靈活性,缺

點是存取慢。
        java棧記憶體是一個資料可共用的地區,棧中資料的大小和生存周期是

確定的。棧中存放的一般是一些基本變數和物件控點。缺乏靈活性,存取快。
        其實我感覺自己這兩句話的總結應付一些面試題是沒問題的。比如說

string str1=new  string(“fish”);new出的是對象,自然在堆。
string str2=“fish” 是一個變數的引用會存在棧中。所以很明顯str1!

=str2。若str3=“fish”。他也是在棧中而且棧中資料共用所以str2==str3.再

說string str4= new  string(“fish”) ;雖然str4和str1都是建立對象在

堆中。但是我沒說過堆中資料共用所以,所以他們只是值相同,但是str1!

=str4在字串中equals方法我把他理解是比較數值是否相等。所以這樣很好理

解這三個值都是一樣的所以相等。
    說到str1!=str4,我想到一個問題就是因為他們是兩個獨立的對象,有各

自生命週期。所以他們生命週期是不確定的,因為運行調用而建立,不用而消

亡。所以會被GC自動回收(java的記憶體回收行程)。所以堆中的資料可以通過GC

自動回收,如果不能回收,會可能出現記憶體溢出,一般記憶體溢出可能是短生命

周期的變數用長生命週期定義導致資料在記憶體不用,卻佔據記憶體資源,所以也

可以自己手動回收。
如果是new的對象,說明他的生命週期因為運行而生,不用而亡。說明這樣可以

提高記憶體效率,不必總是霸佔資源。所以現在我們可以知道string str=new

string(“”);比string str=“”;要好。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.