1. 程式人生 > >為什麼要有棧記憶體和堆記憶體之分

為什麼要有棧記憶體和堆記憶體之分

 在看jvm原理的時候,經常會聽到堆疊,但對其概念默默糊糊,只知道棧是先進後出的資料結構(FILO),而堆是樹的一種特例。堆的特點是子節點都比父節點要小,堆用於動態建立分配記憶體,建立和刪除節點的時間複雜度是O(logn)。棧建立和刪除的時間複雜

度是O(1),速度更快。

 堆疊的出現,源於對記憶體的優化,你知道,java有垃圾回收,堆的生命週期要高於棧,為了能高效利用記憶體,尼瑪,就把一些生

命週期短點的東西,放到棧裡面,便於垃圾回收。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配記憶體大小,生存期也不必事

先告訴編譯器,因為它是在執行時動態分配記憶體的,Java的垃圾收集器會自動收走這些不再使用的資料。但缺點是,由於要在執行時

動態分配記憶體,存取速度較慢。棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是存在棧中的資料大小和

生存週期必須都是確定的,缺乏靈活性。棧中主要存放一些型別的變數(int,short,long等)和物件控制代碼。