JVM篇--JAVA內存區域詳解

 前兩年有跟過免費視頻完整的學習完了jvm,轉瞬間就都忘光了,估計java虛擬機這個東西不背下來完全不理解爲什麼會這樣實現,這一陣又買了視頻重新學習下jvm,然後有時間記錄到博客裏。

那就先來說一下java內存區域的分佈的介紹把

目錄

1.Java內存區域

1.1 Java內存區域分佈

1.1.1java內存區域-程序計數器

1.1.2java內存區域-java虛擬機棧

1.1.3java內存區域-本地方法棧

1.1.4java內存區域-堆

1.1.5java內存區域-方法區

 1.1.6java內存模型-方法區運行時常量池


1.Java內存區域

1.1 Java內存區域分佈

網圖,jdk1.8之後的分佈圖

上圖中方法區和堆是線程內存共享區,java虛擬機棧和本地方法棧還有程序計數器是線程內獨有的內存

1.程序計數器:主要記錄字節指定的行號,對Class文件一行一行執行。

2.java虛擬機棧:在執行方法的時候java虛擬機就創建了棧幀,那麼對應的入棧到出棧就是方法調用的整個過程,一個方法對應一個棧。

3.本地方法棧:java虛擬機調用本地方法庫。

4.方法區:存儲類,類信息,類變量,靜態變量等等。

5.堆:幾乎所有的數組和對象的創建都是在堆生成的。

1.1.1java內存區域-程序計數器

1.程序計數器是什麼?

  • 程序計數器是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器
  • 線程是一個獨立執行單元,是由cpu控制執行的。
  • 字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令、分支、循環、跳轉、異常處理、線程恢復等基礎功能都需要依賴這個計數器完成。

2.程序計數器的作用?

  • 爲了線程切換後能恢復正確的執行位置,每條線程都需要有一個獨立的程序計數器,各條線程之間計數器互不影響,獨立存儲,我們稱這類內存區域爲“線程私有”的內容。

3.程序計數器的特點?

  • 內存區域中唯一一個沒有規定任何OutOfMemoryError情況的區域。因爲這塊程序員無法操作。

1.1.2java內存區域-java虛擬機棧

1.java虛擬機棧是什麼?

  • 用於作用於方法執行的一塊java內存區域。

2.java虛擬機棧的作用?

  • 每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作樹棧、動態鏈接、方法等信息。每一個方法從調用直到執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。

    那麼局部變量表、操作數棧、動態鏈接都是什麼呢?下圖解答

    

   定義的a變量就叫局部變量表,aa和bb的計算就是操作數棧,動態鏈接是創建對象的引用就是動態鏈接

3.java虛擬機棧的特點?

  •   局部變量表存放了編譯期可知的各種基本數據類型(boolean、byte、char、int…)
  •   如果線程請求棧深度大於虛擬機所允許的深度,將拋出StackOverFlowError異常.

3.java虛擬機棧情景案例

用下列方法演示入棧,出棧

 

 忽略我畫的草草的圖,懂了就行,上圖,main方法先入棧,然後b,然後a,出棧的順序就是先進後出,先a出棧,在b出棧,最後是main方法

4.模擬棧溢出

 main方法入棧以後,就無休止的調用,直到棧滿開始報錯棧溢出

1.1.3java內存區域-本地方法棧

1.本地方法棧是什麼?

  • 用於作用域本地方法執行的一塊java內存區域塊
  • 什麼是本地方法,就比如native方法,java調用本語言之外的例如c語言。

2.本地方法棧的作用?

與java虛擬機棧相同,每個方法在執行的同時都會創建一個棧幀,用於存儲局部變量表、操作數棧、動態鏈接、方法等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。

3.本地方法棧的特點?

Hotshot(java虛擬機的一種)將java虛擬機棧和本地方法棧合二爲一

1.1.4java內存區域-堆

1.堆是什麼?

是java內存區域中一塊用來存放對象實例的區域,幾乎所有的對象實例都在這裏分配。

2.堆的特點?

  • java堆是垃圾收集器管理的主要區域,因此很多時候也被稱作"GC堆"
  • 可以設置堆大小
  • java堆可以分成新生代和老年代,新生代分爲to Space、From Space、Eden
  • 堆是線程共享的

1.1.5java內存區域-方法區

1.方法區是什麼?

是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯厚的代碼等數據

2.方法區的作用?

  • 內存中存放類信息、靜態變量等數據,屬於線程共享的一塊區域。
  • Hotspot使用永久代來實現方法區

3.方法區的特點?

  • 並非數據進入了方法區就如永久代的名字一樣永久存在了,該區域的內存回收主要是針對常量池的回收和堆類型的卸載。
  • 方法區也會拋出OutOfMemoryError,當它無法滿足內存分配要求時。

 1.1.6java內存模型-方法區運行時常量池

1.運行時常量池是什麼?

運行時常量池是方法區的一部分,Class文件除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用來存放編譯器生成的各種字面量和符號引用。這部分內容將在類加載後進入方法區的運行時常量池中存取。

2.運行時常量池特點?

運行時常量池是方法區的一部分,受到方法區內存的限制,當常量池再申請到內存時會拋出OutOfMemoryError異常。

3.圖解運行時常量池

畫圖解答以上是true還是false

 

 2

 

3

 

 

以上就是全部內容,希望可以幫到你!

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