日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jvm学习笔记(二)

發(fā)布時間:2024/9/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm学习笔记(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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ū)包含了:

  • pc register(程序計數(shù)器)
  • 虛擬機(jī)棧
  • 方法區(qū)
  • 運(yùn)行時常量池
  • 本地方法棧
  • 程序計數(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ù)棧
  • 動態(tài)連接
  • 方法返回地址
  • 局部變量表:存放了編譯期可知的各種基本類型數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。