1. 程式人生 > >堆,棧,字串池,以及程序,執行緒淺談記憶體(個人理解)

堆,棧,字串池,以及程序,執行緒淺談記憶體(個人理解)

程序:一個服務的執行至少一個程序的開啟。程序就是程式的一次執行,功能的一次跑動。說簡單點好比點選跳轉,就是開啟一個程序。

執行緒:執行緒是程序的實體,簡單點說,執行緒就是分配空間(堆,棧),整合記憶體空間,處理資料交換。

一個程序可以擁有多個執行緒,多個執行緒之間可同時,協同執行。

 

堆:記憶體空間對物件分配的空間通稱,分全域性堆和區域性堆。全域性堆就是未分配使用的空間,區域性堆就是執行緒中分配的空間,當該執行緒所屬的程序結束或關閉,記憶體會釋放。

棧:開啟程序後,記憶體分配給執行緒內所定義的變數的空間統稱。

 

以java語言 main主函式為例,淺談標題;

 main方法載入進棧;

程序開啟,main方法最先入棧,main棧內分配空間儲存main方法內定義的所有變數,而物件資料會儲存在堆中,字串資料會儲存在字串池中,執行完畢,main出棧,記憶體釋放。

簡單說下字串池以及堆中資料的建立和對映;

資料儲存在記憶體中都會自帶一個記憶體位置,格式例為0x0034這種格式,資料跟變數的繫結都可以理解為是變數跟記憶體位置的對映。當定義一個變數型別為字串時,作業系統首先要在字串池中查詢建立的資料是否以及存在字串池中了,如果已經存在,只需要將該資料所對應的空間位置(0x0034)與該變數繫結而不需要在字串池中建立該資料,反之,字串池中建立資料,空間位置繫結變數。所以說變數名可以有很多不一樣,但字串池中的資料都是唯一的。而堆跟字串池不同,沒new一個物件都是全新的不同資料,即使物件資料相同;