Java中執行緒與堆棧的關係

  • 2019 年 10 月 26 日
  • 筆記

是執行緒私有的,每個執行緒都是自己的棧,每個執行緒中的每個方法在執行的同時會創建一個棧幀用於存局部變數表、操作數棧、動態鏈接、方法返回地址等資訊。每一個方法從調用到執行完畢的過程,就對應著一個棧幀在虛擬機棧中從入棧到出棧的過程。其中局部變數表,存放基本類型(boolean、byte、char、short、int、float)、對象的引用等等,對象的引用不是對象實例本身,而是指向對象實例的一個指針。

是執行緒共享的,所有的對象的實例和數組都存放在堆中,任何執行緒都可以訪問。Java的垃圾自動回收機制就是運用這個區域的。

方法區也是執行緒共享的,用於存放類資訊(包括類的名稱、方法資訊、欄位資訊)、常量、靜態變數以及即時編譯器編譯後的程式碼等等。

這麼講比較抽象,寫段程式碼:

當程式執行到箭頭指向那一個行程式碼的時候,
入參i和局部變數j都是基本類型,直接存放在棧中。
入參str和oneMoreStudy是對象類型,在棧中只存放對象的引用。
如下圖: