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