JVM---內存分配及初入垃圾回收

上一篇文章中《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來說 就是一些暫用了內存空間卻沒有用的垃圾,需要進行清理-------------垃圾回收。

         

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