jvm学习笔记(二)
jvm學習筆記(二)
文章目錄
- jvm學習筆記(二)
- 1.全部筆記鏈接
- 2. Native關鍵字
- 3.關于JVM規范
- 3.1 JVM規范中運行時數據區的概念
- 4.HotSpot的JVM運行時數據區
- 4.1 JVM運行時數據區(HotSpot jdk1.7)
- 4.2 JVM運行時數據區(HotSpot jdk1.8 )
- 5. Java虛擬機棧
- 5.1棧幀組成
- 6.永久代的變化
1.全部筆記鏈接
JVM學習筆記(一)
JVM學習筆記(二)
JVM學習筆記(三)
JVM學習筆記(四)
(待更新…)
2. Native關鍵字
作用
Native關鍵字作用:調用底層C語言的庫,也就是調用本地方法接口(JNI)
JNI的作用:擴展JAVA的使用,融合不同的編程語言。如:C,C++
Native Method stack(本地方法棧):調用了的本地方法將在本地方法棧進行壓棧,對本地方法進行登記。
3.關于JVM規范
Java語言和虛擬機規范:https://docs.oracle.com/javase/specs/index.html
JAVA虛擬機規范是一種對JAVA虛擬機實現的規范要求,是由oracle制定的,而我們平時常說的JAVA虛擬機一般是指的一種具體的JAVA虛擬機規范的實現。
3.1 JVM規范中運行時數據區的概念
jvm規范中的運行時數據區包含了:
程序計數器
Java虛擬機可以一次支持多個執行線程,每個Java虛擬機線程都有其自己的 pc(程序計數器)寄存器。在任何時候,每個Java虛擬機線程都在執行單個方法的代碼,即該線程的當前方法。如果不是 native,則該pc寄存器包含當前正在執行的Java虛擬機指令的地址。如果線程當前正在執行的方法是native,則Java虛擬機的pc 寄存器值為null。
Java虛擬機棧
每個Java虛擬機線程都有一個私有Java虛擬機棧,與該線程同時創建。Java虛擬機棧類似于C之類的常規語言的棧:它保存局部變量表和部分結果,并在方法調用和返回中起作用。
堆
Java虛擬機具有一個在所有Java虛擬機線程之間共享的堆。堆是運行時數據區,從中分配了所有類實例和數組的內存。
堆是在虛擬機啟動時創建的。對象的堆存儲由自動存儲管理系統(稱為垃圾收集器)回收;對象永遠不會顯式釋放。Java虛擬機不假定特定類型的自動存儲管理系統,可以根據實現者的系統要求選擇存儲管理技術。堆的大小可以是固定的,也可以根據計算的需要進行擴展,如果不需要更大的堆,則可以將其收縮。堆的內存不必是連續的。
方法區
Java虛擬機具有在所有Java虛擬機線程之間共享的方法區域。該方法區域類似于常規語言的編譯代碼的存儲區域,或者類似于操作系統過程中的“文本”段。它存儲每個類的結構,例如運行時常量池,字段和方法數據,以及方法和構造函數的代碼,包括用于類和實例初始化以及接口初始化的特殊方法
運行時常量池
它包含多種常量,范圍從編譯時已知的數字文字到必須在運行時解析的方法和字段引用。運行時常量池的功能類似于常規編程語言的符號表,盡管它包含的數據范圍比典型的符號表還大。
本地方法棧
Java虛擬機的實現可以使用俗稱“ C堆棧”的常規堆棧來支持native方法(以Java編程語言以外的其他語言編寫的方法)。解釋程序的實現也可以使用諸如C之類的語言來解釋Java虛擬機的指令集,以使用native 本機方法棧。無法加載方法并且自身不依賴于常規堆棧的Java虛擬機實現不需要提供本機方法棧。如果提供,通常在創建每個線程時為每個線程分配本機方法堆棧。
4.HotSpot的JVM運行時數據區
**HotSpot 是JVM概念的一個實現。**它最初由Sun開發,現在由Oracle擁有。 JVM規范還有其他實現,例如 JRockit ,IBM J9 等等。
切忌將規范跟實現混為一談。下面的JVM運行時數據區是根據HotSpot進行介紹的。
4.1 JVM運行時數據區(HotSpot jdk1.7)
JDK8 之前,Hotspot 中方法區的實現是永久代(Perm),JDK1.6運行時常量池在方法區里面,而永久代是方法區的實現,運行時所以常量池在永久代里面,而JDK1.7永久代開始退化,運行時常量池放在了堆中,并且提出了刪除永久代的概念。
- 永久代(Perm)里面放的是:static,final,Class
- 運行時常量池:常量池被放到堆中(永久代開始退化)
- 局部變量表:存放了編譯期可知的各種基本類型數據(boolean、byte、char、short、int、float、long、double)、對象引用、returnAddress類型(指向了一條字節碼指令的地址)。
下圖為JDK1.6的JVM運行時數據區:
4.2 JVM運行時數據區(HotSpot jdk1.8 )
JDK8 之前,Hotspot 中方法區的實現是永久代(Perm),JDK8 開始使用元空間(Metaspace),以前永久代所有內容的字符串常量移至堆內存,其他內容移至元空間,元空間直接在本地內存分配。
- 元空間(Metaspace)存放:static,final,Class等
- 運行時常量池:放到堆內存中
5. Java虛擬機棧
5.1棧幀組成
局部變量表:存放了編譯期可知的各種基本類型數據(boolean、byte、char、short、int、float、long、double)、對象引用、returnAddress類型(指向了一條字節碼指令的地址)。
操作數棧:存儲方法內一些進行了運算操作后的結果。
動態鏈接:在方法內調用接口,通過字面量鏈接到具體的實現類,實現Java的動態特性。
方法出口(返回地址):return或者發生Exception等。
6.永久代的變化
- JDK1.6之前:永久代,運行時常量池在方法區
- JDK1.7 :永久代開始退化,提出去永久代,運行時常量池在堆中
- JDK1.8 :無永久代,變成元空間
總結
以上是生活随笔為你收集整理的jvm学习笔记(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WIFI路由器怎么限制不让人联网link
- 下一篇: jvm学习笔记(三)