国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JVM虛擬機筆記之運行時數據區域(一)

mgckid / 3559人閱讀

摘要:本文參照深入了解虛擬機周志明,純粹做做筆記,寫寫自己覺得較為重要的內容方便理解虛擬機運行時數據區如下程序計數器程序計數器寄存器是一塊較小的內存空間,看做是當前線程所執行的字節碼的行指示器。異常情況也與虛擬機棧一致。

本文參照深入了解Java虛擬機-周志明,純粹做做筆記,寫寫自己覺得較為重要的內容方便理解

Java虛擬機運行時數據區如下:

1.程序計數器

程序計數器(PC寄存器)是一塊較小的內存空間,看做是當前線程所執行的字節碼的行指示器

1.字節碼解釋器工作時改變這個計數器的值來選取下一條需要執行的字節碼指令,如分支丶循環丶跳轉丶異常處理丶線程恢復等。

2.多線程是通過線程輪流分配CPU時間方式來實現的,為了上下文切換后恢復到正確的執行位置,每個線程有獨立的程序計數器,因此這塊內存是線程私有的。

3.執行過程若線程執行Java方法,則計數器記錄的是當前運行的虛擬機字節碼指令的地址;若執行的是native方法,則計數器為

4.此內存區域是唯一沒有內存溢出的區域。

2.Java虛擬機棧

虛擬機棧:也是私有的,它的生命周期與線程相同(調用至執行完畢對應著入棧和出棧過程。)。Java虛擬機棧描述的是Java方法執行的內存模型,每個方法執行的時候都會在棧創建一個棧幀(方法運行時的基礎數據結構).

可通過參數 棧幀是方法運行期的基礎數據結構棧容量可由-Xss設置

.
1.棧幀:用于保存局部變量表丶操作數棧丶動態鏈接丶方法出口等信息。

局部變量表:32位變量槽,存放了編譯期可知的各種基本數據類型、對象引用(reference類型,不同于對象本身,可能是指向對象起始地址的引用指針,也可能是指向一個代表對象的句柄或其他與此對象相關的位置)、returnAddress類型(指向了一條字節碼指令的地址)。

操作數棧:基于棧的執行引擎,虛擬機把操作數棧作為它的工作區,大多數指令都要從這里彈出數據、執行運算,然后把結果壓回操作數棧。

動態連接:每個棧幀都包含一個指向運行時常量池(方法區的一部分)中該棧幀所屬方法的引用。持有這個引用是為了支持方法調用過程中的動態連接。Class文件的常量池中有大量的符號引用,字節碼中的方法調用指令就以常量池中指向方法的符號引用為參數。這些符號引用一部分會在類加載階段或第一次使用的時候轉化為直接引用,這種轉化稱為靜態解析。另一部分將在每一次的運行期間轉化為直接應用,這部分稱為動態連接

方法出口:返回方法被調用的位置,恢復上層方法的局部變量和操作數棧,如果無返回值,則把它壓入調用者的操作數棧。

備注:另外局部變量表的內存空間在編譯期間就確定了,運行過程中不會改變,如double long占據2個局部變量空間,其余數據類型占用一個。

2.異常情況:如果線程請求的棧深度大于虛擬機所允許的深度,則拋出StackOverflowError;不過現在大部分可以支持動態擴展,若擴展時無法申請到足夠的內存,則拋出OutofMemoryError.

3.本地方法棧:

本地方法棧和Java虛擬機棧作用類似,區別是虛擬機棧為Java方法(也就是字節碼)服務,而本地方法棧為虛擬機使用到的native方法服務。異常情況也與虛擬機棧一致。

4.Java堆

可通過參數 -Xms 初始堆大小和-Xmx 最大堆大小-Xmn 新生代` 設置

虛擬機中管理的內存最大的一塊,所有線程共享,虛擬機啟動時創建。此內存區域唯一目的是存放對象實例,幾乎所有對象實例及數組都要在堆上分配內存。(隨著JIT編譯器發展和逃逸技術,可能有些實例不在堆分配)。

1.垃圾收集:Java堆是垃圾回收的主要區域,從內存回收的角度來看,由于現在收集器基本采用分代收集算法

所以堆還可以細分為:

新生代:包括Eden區、From Survivor區、To Survivor區,系統默認大小Eden:Survivor=8:1:1。

老年代:在年輕代中經歷了N次垃圾回收后仍然存活的對象,就會被放到老年代中。因此,可以認為老年代中存放的都是一些生命周期較長的對象。

2.從內存分配的角度來看,線程共享的堆可能會劃分出多個線程私有的分配緩沖區(Thread Local Allocation Buffer.TLAB).
劃分目的:為了更好地回收內存,或者更快得分配內存。

3.Java堆可以處在物理上不連續的內存空間,只要邏輯連續即可,堆也是可擴展的(通過 -Xmx -Xms控制)。

5.方法區(元空間,Metaspace):

可通過參數-XX:MaxPermSize設置

與堆相同,也是線程共享的數據區域,用于存儲已被虛擬機加載的類信息丶常量丶靜態變量即時編譯器編譯后的代碼等數據。

垃圾收集:垃圾收集行為在此區域較少出現,回收目標主要是針對常量池的回收和對類型的卸載,但是對類型卸載很苛刻,對此區域未完全回收則出現內存泄漏。

運行時常量池

可通過參數-XX:PermSize和-XX:MaxPermSize設置

屬于方法區的一部分。class文件除了有類的版本,方法,字段,接口等描述信息外,還有常量池用于存放編譯器生成的各種字面量和符號引用,類加載后進入方法區的運行時常量池存放。

常量池(ConstantPool):常量池數據編譯期被確定,是Class文件中的一部分。存儲了類、方法、接口等中的常量,當然也包括字符串常量。

運行時常量池(Runtime Constant Pool):方法區的一部分,所有線程共享。虛擬機加載Class后把常量池中的數據放入到運行時常量池。

常量池中主要存放兩大類常量:字面量(Literal)和符號引用(Symbolic Reference)。
1.字面量:文本字符串、聲明為final的常量值等。

2.符號引用:類和接口的完全限定名(Fully Qualified Name)、字段的名稱和描述符(Descriptor)、方法的名稱和描述符,還有文本字符串的引用。

比如說:String a = "123";Class b =XX.Class,String c =類final變量中,abc都是符號引用

JDK1.6之前字符串常量池位于方法區之中。

JDK1.7字符串常量池已經被挪到堆之中。

備注:運行時常量池還具備動態性,并非只編譯器才能產生,運行期也可以產生,比如String的intern方法。

6.直接內存

可通過-XX:MaxDirectMemorySize指定,如果不指定,則默認與Java堆的最大值(-Xmx指定)一樣。直接內存為非虛擬機內存,如下:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73775.html

相關文章

  • 《深入理解java虛擬》學習筆記系列——java內存區域劃分

    摘要:運行時數據區域的學習,是學習以及機制的基礎,也是深入理解對象創建及運行過程的前提。了解內存區域劃分,是學習概念的前提。 Java 運行時數據區域的學習,是學習 jvm 以及 GC 機制的基礎,也是深入理解 java 對象創建及運行過程的前提。廢話不多說,直接進入正題: 一張圖總結 showImg(https://segmentfault.com/img/bVOMAn?w=685&h=5...

    史占廣 評論0 收藏0
  • 【讀書筆記JVM垃圾收集與內存分配策略

    摘要:堆和方法區只有在程序運行時才能確定內存的使用情況,垃圾回收器所關注的主要就是這部分內存。虛擬機會根據當前系統的運行情況收集性能監控信息,動態調整比率參數以提供最合適的停頓時間或最大的吞吐量。 Tip:內容為對《深入理解Java虛擬機》(周志明 著)第三章內容的總結和筆記。這是第一次拜讀時讀到的一些重點,做個分享,也為后面再次閱讀和實踐做保障。 3.1 概述 程序計數器、虛擬機棧、本地...

    mcterry 評論0 收藏0
  • 《深入理解JVM》讀書筆記

    摘要:抽時間重新讀了一遍深入理解一書。驗證確保文件的字節流中包含的信息符合當前虛擬機的要求,并且不會危害虛擬機自身的安全。可見性可見性是指當一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。 抽時間重新讀了一遍《深入理解JVM》一書。以下為摘錄內容。 1 java內存區域 showImg(https://segmentfault.com/img/bVboDgk?w=617&h=365...

    idealcn 評論0 收藏0
  • jvm基礎篇內存區域

    摘要:堆區堆是虛擬機所管理的內存中最大的一塊,它是被所有線程共享的一塊內存區域,該區域在虛擬機啟動的時候創建。 運行時數據區域 ? ?想要了解jvm,那對其內存分配管理的學習是必不可少的;java虛擬機在執行java程序的時候會把它所管理的內存劃分成若干數據區域。這些區域有著不同的功能、用途、創建/銷毀時間。java虛擬機所分配管理的內存區域如圖1所示 程序計數器 ? ?程序計數器是一塊比較...

    Zachary 評論0 收藏0
  • 讀書筆記深入理解Java虛擬

    摘要:前言本文內容基本摘抄自深入理解虛擬機,以供復習之用,沒有多少參考價值。此區域是唯一一個在虛擬機規范中沒有規定任何情況的區域。堆是所有線程共享的內存區域,在虛擬機啟動時創建。虛擬機上把方法區稱為永久代。 前言 本文內容基本摘抄自《深入理解Java虛擬機》,以供復習之用,沒有多少參考價值。想要更詳細了解請參考原書。 第二章 1.運行時數據區域 showImg(https://segment...

    jaysun 評論0 收藏0

發表評論

0條評論

mgckid

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<