java內存簡單總結

總結一下jvm的運行時數據區域Runtime Data Areas

   當運行一個JVM實例時,系統將分配給這個實例一塊內存區域(由jvm自己管理)。從這一塊內存中分出一塊用來存儲一些運行數據,例如創建的對象,傳遞給方法的參數,局部變量,返回值等等。分出來的這一塊就稱爲Runtime Data Areas

     Runtime Data Areas可以劃分爲6大塊:Java棧、程序計數寄存器(PC寄存器)、本地方法棧(Native Method Stack)、Java堆、方法區域、運行常量池:


wKiom1NYhivTy7QDAADcK2t-1dk221.jpg由上圖可知,程序計數器、java棧、本地方法棧是每個線程所獨有的,而方法區域、、java堆、運行時常量池則是線程共享的區域。

1、java棧:

       每當一個方法被調用時,jvm就往java棧裏面壓入一個棧幀,棧幀結構如下

     

wKioL1NYzbiA_wjiAACLrIAdF4w653.jpg

   棧幀包含3個部分:局部變量數組、操作數棧、方法所屬類的常量池引用。

   局部變量數組:依次存放方法所屬對象的引用this、形參、局部變量等(對於靜態方法沒有this,所以這裏不會存對象的引用)

   操作數棧:存放執行時有一些中間變量,在執行方法時候,壓入或彈出這些變量,操作數棧是方法真正工作的地方。

   常量池引用:當jvm執行某個方法時需要用到常量,就會利用常量的引用去訪問常量池

   如果方法通過return返回,則將該方法所屬的棧幀從java棧裏面彈出,如果return有返回值,則將返回值壓入調用該方法的操作數棧中


2、本地方法棧:通過調用本地方法來完成某些功能

3、方法區域:屬於共享區域。在方法區域內,存放類的字節碼和方法的信息等

4、java堆:屬於共享區域。堆中存放的是程序創建的對象或者實例,這一塊對jvm的性能影響很大,垃圾回收機制就是在這個區域工作的。

5、常量池:屬於共享區域。存放類和接口以及方法和域的所有引用,當一個方法被引用時,jvm通過常量池中的應用來查找內存中實際引用的地址。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章