總結一下jvm的運行時數據區域Runtime Data Areas
當運行一個JVM實例時,系統將分配給這個實例一塊內存區域(由jvm自己管理)。從這一塊內存中分出一塊用來存儲一些運行數據,例如創建的對象,傳遞給方法的參數,局部變量,返回值等等。分出來的這一塊就稱爲Runtime Data Areas。
Runtime Data Areas可以劃分爲6大塊:Java棧、程序計數寄存器(PC寄存器)、本地方法棧(Native Method Stack)、Java堆、方法區域、運行常量池:
由上圖可知,程序計數器、java棧、本地方法棧是每個線程所獨有的,而方法區域、、java堆、運行時常量池則是線程共享的區域。
1、java棧:
每當一個方法被調用時,jvm就往java棧裏面壓入一個棧幀,棧幀結構如下
棧幀包含3個部分:局部變量數組、操作數棧、方法所屬類的常量池引用。
局部變量數組:依次存放方法所屬對象的引用this、形參、局部變量等(對於靜態方法沒有this,所以這裏不會存對象的引用)
操作數棧:存放執行時有一些中間變量,在執行方法時候,壓入或彈出這些變量,操作數棧是方法真正工作的地方。
常量池引用:當jvm執行某個方法時需要用到常量,就會利用常量的引用去訪問常量池
如果方法通過return返回,則將該方法所屬的棧幀從java棧裏面彈出,如果return有返回值,則將返回值壓入調用該方法的操作數棧中
2、本地方法棧:通過調用本地方法來完成某些功能
3、方法區域:屬於共享區域。在方法區域內,存放類的字節碼和方法的信息等
4、java堆:屬於共享區域。堆中存放的是程序創建的對象或者實例,這一塊對jvm的性能影響很大,垃圾回收機制就是在這個區域工作的。
5、常量池:屬於共享區域。存放類和接口以及方法和域的所有引用,當一個方法被引用時,jvm通過常量池中的應用來查找內存中實際引用的地址。