Java中線程與堆棧的關係

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

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

方法區也是線程共享的,用於存放類信息(包括類的名稱、方法信息、字段信息)、常量、靜態變量以及即時編譯器編譯後的代碼等等。

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

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