上一篇文章中《jvm--類加載》中,瞭解了編寫的java文件是如何被jvm識別的。部署項目的時候,內存是比較昂貴的資源,.jar包或者.war包中的class文件,在jvm中針對其中運行的方法和創建的對象是如何分配內存和工作的呢。
1、方法區
方法區主要存放“.class”文件里加載進來的類,以及常量池,類變量。jdk1.8以後,改名字叫“Metaspace”.
2、程序計數器
.class文件中對應的字節碼指令,是一條條的機器指令。當.class文件加載到內存後,jvm會用自己的字節碼執行引擎,去執行我們編譯出來的代碼。在這個過程中,jvm中分配了一個特殊的內存區域叫程序計數器,來記錄當前執行的字節碼指令的位置。
在多核時代,而且jvm支持多個線程,代碼裏面也可能開啓多個線程,程序中會出現多個線程併發執行不同的代碼指令。所以,每一個線程都會有一個自己的程序計數器。
3、java虛擬機棧
java代碼執行的過程中,一定是線程來執行某個方法中的代碼。jvm中會有一塊區域,保存每個方法內的局部變量等數據,也就是java虛擬機棧。每個線程都有自己的java虛擬機棧,調用方法時會創建棧幀(棧幀裏存放着方法的局部變量表、操作數棧、方法出入口等信息)。方法的調用對應着入棧和出棧。
4、堆內存
堆內存中存放代碼中創建的各種對象。比如java虛擬機棧的一個ClassA instance = new ClassA().創建出來的new ClassA()會放在jvm中的堆內存中,而instance持有它的一個引用。
5、本地方法棧
native方法調用的時候 ,jvm中會分配出一塊區域,存放native方法的局部變量表數據,這塊區域就叫做本地方法棧。
-----------------------------------------------------華麗的分割線-----------------------------------------------------------------------------------
方法調用的時候,java虛擬機棧中的局部變量會引用堆內存的對象。方法調用完,堆內存的對應已經沒有引用指向。對於jvm來說 就是一些暫用了內存空間卻沒有用的垃圾,需要進行清理-------------垃圾回收。