最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA JVM運行時數(shù)據(jù)區(qū)詳解

 更新時間:2021年09月02日 11:50:54   作者:蒼何fly  
這篇文章主要介紹了JVM運行時數(shù)據(jù)區(qū)劃分原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一、前言

這是JVM系列文章的第三篇,這篇文章將對整個JVM運行時數(shù)據(jù)區(qū)和GC垃圾回收詳細的介紹。這部分也算是JVM的核心內(nèi)容了。

二、運行時數(shù)據(jù)區(qū)整體概架構(gòu)

在這里插入圖片描述

以下是自己的一句話總結(jié):

分為線程私有和線程共享的兩大類,其中程序計數(shù)器、虛擬機棧、本地方法棧是屬于線程私有的,堆內(nèi)存及方法區(qū)內(nèi)存是線程共享的。程序計數(shù)器主要是記錄字節(jié)碼指令,CPU上下文切換線程,從一個線程切換到另一個線程,需要知道線程執(zhí)行到哪一步,所以記錄這個指令就是很有必要的,程序計數(shù)器無OOM和GC的發(fā)生。虛擬機棧里面是一個個棧幀,每一個棧幀對應(yīng)著每一個方法,棧幀又是由局部變量表、操作數(shù)棧、方法返回值地址、動態(tài)鏈接組成。虛擬機??赡軙l(fā)生棧溢出異常,即starkoverflow本地方法棧是存放本地方法相關(guān)的東西;堆是一塊很大的空間,整體分為2大塊,新生代和老年代,新生代又分了Eden區(qū)、S0區(qū)、S1區(qū),垃圾回收主要發(fā)生在新生代,每一個區(qū)對應(yīng)不同的垃圾回收算法;方法區(qū)保存的是一些常量、類的基本信息等,方法區(qū)對應(yīng)的實現(xiàn)在JDK7中是永久代,在JDK8中是元空間。

三、程序計數(shù)器

用來儲存指向下一條指令的地址,是線程私有的,生命周期和線程的生命周期一致。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

四、虛擬機棧

虛擬機棧是線程私有的,內(nèi)部保存一個個棧幀,每一個棧幀對應(yīng)一個Java方法的調(diào)用,生命周期和線程的生命周期保持一致。先來看看棧的特點。

在這里插入圖片描述

1、棧的特點

棧是運行時的單位,而堆是存儲的單位。棧的特點是先進后出,后進先出。

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

可以通過參數(shù)-Xss來設(shè)置棧空間大小

2、棧幀的內(nèi)部結(jié)構(gòu)

在這里插入圖片描述

3、局部變量表

是一個數(shù)字數(shù)組,主要用于存儲方法參數(shù)和定義在方法內(nèi)的局部變量,這些數(shù)據(jù)類型包括各類基本數(shù)據(jù)類型,對象引用等,所需的容量大小是在編譯期確定下來的,在方法運行期間是不會改變局部變量表大小的。

關(guān)于Slot的理解:

在這里插入圖片描述

靜態(tài)變量和局部變量的區(qū)別:

在這里插入圖片描述

總結(jié):

在棧幀中,與性能關(guān)系最為密切的就是局部變量表,在方法執(zhí)行時,虛擬機使用局部變量表完成完成方法的傳遞,局部變量表中的數(shù)據(jù)也是可達性分析中的GC Root,如果一個對象在局部變量表中還有引用,那么根絕可達性分析算法,這個變量就不屬于垃圾對象,是不會被GC回收的。

4、操作數(shù)棧

操作數(shù)棧是棧中棧,也可稱為表達式棧,在方法執(zhí)行過程中,根據(jù)字節(jié)碼指令,往棧中寫入數(shù)據(jù)或提取數(shù)據(jù),即入棧和出棧。主要用于保存計算過程的中間結(jié)果。操作數(shù)棧,可以看成是臨時寄存器,計算過程中變量的臨時保存

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

5、動態(tài)鏈接

在這里插入圖片描述

在這里插入圖片描述

方法重寫的本質(zhì)

在這里插入圖片描述

6、方法返回地址

存放調(diào)用該方法的PC寄存器的值

在這里插入圖片描述

五、本地方法棧

管理本地native本地方法,是線程私有的,所謂的本地方法,其實就是一些非Java語言寫的代碼,這部分代碼甚至可以和操作系統(tǒng)CPU進行打交道。

六、堆

堆是內(nèi)存管理的核心區(qū)域,是線程共享的,屬于JVM級別,也就是一個JVM實例就會有一個堆空間,注意的是雖然堆整體上是線程共享的,但是在內(nèi)部有一小塊空間是線程私有的緩存區(qū)TLAB。

幾乎所有的對象實例都是在堆中,堆是GC垃圾回收的重點區(qū)域。堆整體可以分為新生代和老年代,新生代又分為Eden區(qū)和S0和S1區(qū)。

在這里插入圖片描述

新生代和老年代的比例是1:2,Eden區(qū)和s0,s1區(qū)所占空間比例是8:1:1

1、設(shè)置堆大小的參數(shù)

-Xms:用于表示堆區(qū)的起始內(nèi)存,默認情況下,占物理內(nèi)存大小的64分之一。

-Xmx用于表示堆區(qū)的最大內(nèi)存,默認情況下,占物理內(nèi)存的四分之一。

通常起始內(nèi)存和最大內(nèi)存兩個參數(shù)設(shè)置成一樣,目的是為了GC清理完堆區(qū)內(nèi)存后不需要重新分隔
計算堆區(qū)的大小,從而提高性能。
查看設(shè)置的參數(shù):
方式一:jps(查看進程)  
            jstat -gc 進程id
方式二:-xx:+printGCDetails

2、對象分配過程

在這里插入圖片描述

這里s0和s1誰是空的誰就是to,年齡計數(shù)器閾值是15,YGC是在Eden區(qū)滿的時候會觸發(fā),s0和s1滿的時候不會觸發(fā)YGC,YGC會將s區(qū)以及伊甸園區(qū)一起GC

關(guān)于垃圾回收,頻繁在新生區(qū)收集,很少在養(yǎng)老區(qū)收集,幾乎不在永久區(qū)/元空間收集。

在這里插入圖片描述

Visualvm是JVM常用調(diào)優(yōu)工具,在JDK的bin下就可以打開

3、堆中的GC

在這里插入圖片描述

年輕代(Minor GC)觸發(fā)機制

在這里插入圖片描述

老年代GC(Major GC/Full GC)觸發(fā)機制

Full GC 觸發(fā)機制

在這里插入圖片描述

4、內(nèi)存分配策略

在這里插入圖片描述

5、什么是TLAB

在這里插入圖片描述

在這里插入圖片描述

TLAB表明堆不一定是共享的。

6、堆是分配對象存儲的唯一選擇嗎?

如果經(jīng)過逃逸分析,一個對象并沒有逃逸出方法的話,那么就有可能被優(yōu)化成棧上分配。

逃逸分析手段:

在這里插入圖片描述

在這里插入圖片描述

注意:JDK6U23版本后,HotSpot默認已經(jīng)開啟逃逸分析。所以我們得出一個結(jié)論,開發(fā)中能使用局部變量的,就不要使用在方法外定義。JDK7后字符串常量池和靜態(tài)變量存儲在堆中

七、方法區(qū)

方法區(qū)可以看做是一塊獨立于堆的內(nèi)存空間,是線程共享的,主要存儲類信息、運行時常量池等,也會發(fā)生OOM,JDK8前成為永久代,JDK8成為元空間。(元空間和永久代最大的區(qū)別是,元空間不再使用JVM內(nèi)存,而是使用了本地內(nèi)存技術(shù))

1、方法區(qū)概述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

2、設(shè)置方法區(qū)內(nèi)存大小

在這里插入圖片描述

在這里插入圖片描述

3、如何解決OOM問題?

在這里插入圖片描述

4、方法區(qū)存儲什么

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

5、方法區(qū)的演進細節(jié)

在這里插入圖片描述

在這里插入圖片描述

6、方法區(qū)的GC

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解Java 連接MongoDB集群的幾種方式

    詳解Java 連接MongoDB集群的幾種方式

    這篇文章主要介紹了詳解Java 連接MongoDB集群的幾種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Spring整合Quartz定時任務(wù)并在集群、分布式系統(tǒng)中的應(yīng)用

    Spring整合Quartz定時任務(wù)并在集群、分布式系統(tǒng)中的應(yīng)用

    這篇文章主要介紹了Spring整合Quartz定時任務(wù)并在集群、分布式系統(tǒng)中的應(yīng)用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 簡單實現(xiàn)Java通訊錄系統(tǒng)

    簡單實現(xiàn)Java通訊錄系統(tǒng)

    這篇文章主要為大家詳細介紹了如何簡單實現(xiàn)Java通訊錄系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • postman測試傳入List<String>參數(shù)方式

    postman測試傳入List<String>參數(shù)方式

    這篇文章主要介紹了postman測試傳入List<String>參數(shù)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 初識Spark入門

    初識Spark入門

    這篇文章主要介紹了初識Spark入門,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringBoot熔斷機制之CircuitBreaker詳解

    SpringBoot熔斷機制之CircuitBreaker詳解

    這篇文章主要介紹了SpringBoot熔斷機制之CircuitBreaker詳解,SpringBoot的熔斷機制在微服務(wù)架構(gòu)中扮演著重要角色,其中CircuitBreaker是其核心機制之一,用于防止服務(wù)的異常狀態(tài)影響到整個系統(tǒng)的運作,需要的朋友可以參考下
    2023-10-10
  • Java并發(fā)編程之線程狀態(tài)介紹

    Java并發(fā)編程之線程狀態(tài)介紹

    這篇文章主要介紹了Java并發(fā)編程之線程狀態(tài),當線程被創(chuàng)建并啟動以后,它既不是一啟動就進入了執(zhí)行狀態(tài),也不是一直處于執(zhí)行狀態(tài),下面和小編一起進入文章了解具體的相關(guān)介紹吧
    2022-04-04
  • Java多線程與線程池技術(shù)分享

    Java多線程與線程池技術(shù)分享

    這篇文章主要介紹了Java多線程與線程池技術(shù)分享,線程池本質(zhì)是池化技術(shù)的應(yīng)用,和連接池類似,創(chuàng)建連接與關(guān)閉連接屬于耗時操作,下文相關(guān)介紹需要的小伙伴可以參考一下
    2022-03-03
  • MyBatis中調(diào)用存儲過程和函數(shù)的實現(xiàn)示例

    MyBatis中調(diào)用存儲過程和函數(shù)的實現(xiàn)示例

    在MyBatis中調(diào)用存儲過程和函數(shù)是一個相對高級的特性,本文主要介紹了MyBatis中調(diào)用存儲過程和函數(shù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • idea自帶database連接mysql失敗問題的解決辦法

    idea自帶database連接mysql失敗問題的解決辦法

    在IDEA?帶的數(shù)據(jù)庫連接?具中,可以連接MySQL數(shù)據(jù)庫,但是有的時候連接出現(xiàn)錯誤,連接不上數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于idea自帶database連接mysql失敗問題的解決辦法,需要的朋友可以參考下
    2023-06-06

最新評論

乌拉特前旗| 育儿| 盐亭县| 成安县| 麻栗坡县| 永福县| 即墨市| 滁州市| 江津市| 凌源市| 黎城县| 黔东| 邓州市| 准格尔旗| 招远市| 唐海县| 贵州省| 闵行区| 永昌县| 三河市| 陆河县| 都昌县| 会东县| 获嘉县| 珲春市| 万州区| 凭祥市| 鄂托克前旗| 噶尔县| 科技| 海盐县| 商丘市| 龙泉市| 汾阳市| 曲松县| 米林县| 商都县| 黔西县| 藁城市| 黄山市| 安义县|