国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【JVM】JVM內(nèi)存模型詳解

這篇具有很好參考價值的文章主要介紹了【JVM】JVM內(nèi)存模型詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

一、JVM是什么?

JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,是通過在實際的計算機(jī)上仿真模擬各種計算機(jī)功能來實現(xiàn)的。由一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域等組成。JVM屏蔽了與操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需要生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可在多種平臺上不加修改的運(yùn)行,這也是Java能夠“一次編譯,到處運(yùn)行的”原因。

二、JVM內(nèi)存模型圖

jvm,JVM,操作系統(tǒng),jvm,java,面試

三、JVM運(yùn)行數(shù)據(jù)區(qū)詳解
  1. JVM運(yùn)行數(shù)據(jù)區(qū)分為虛擬機(jī)棧、本地方法棧、程序計數(shù)器、堆區(qū)、元空間(方法區(qū))五部分。其中虛擬機(jī)棧、本地方法棧和程序計數(shù)器屬于線程私有,而堆、元空間屬于線程共享。
    jvm,JVM,操作系統(tǒng),jvm,java,面試
  2. 虛擬機(jī)棧中存儲方法、方法中的局部變量、以及運(yùn)行時數(shù)據(jù),本地方法棧和虛擬機(jī)棧類似,只不過本地方法中棧存儲的是本地方法的一些數(shù)據(jù)信息,程序計數(shù)器用來表示程序代碼的執(zhí)行位置,每一線程工作時,都會開辟自己的虛擬機(jī)棧、本地方法棧、和程序計數(shù)器。
  3. 堆區(qū),存儲對象信息,以及數(shù)組,是所有線程共享區(qū)域、
  4. 元空間存儲類加載的相關(guān)信息,以及靜態(tài)變量、常量、運(yùn)行時常量池等。

下面,以代碼演示各個位置存儲的信息:

		//1.首先類加載器將類加載到原空間
	public class Application {
    	//main線程--> main的線程棧,也就是虛擬機(jī)棧
    	//2.執(zhí)行main 方法,將main方法壓入棧
    	public static void main(String[] args) throws Exception {
        //3.load方法壓入虛擬機(jī)棧
        load();
        System.in.read();        //保證程序不要退出
     }
        public static void load() {
        //4.在堆區(qū)創(chuàng)建Config對象,同時在棧區(qū)存儲對象的引用地址,指向堆區(qū)
            Config config = new Config();
        //5.將loadData()方法壓入棧
            config.loadData() ;
        }
    }
public class Config {
    //1.靜態(tài)變量存儲在元空間
    public static Manager mdnagerl = new Manager();
    //2.實例變量/對象變量 和類對象一起存儲在堆區(qū)
    private int a;
	//3.loadData()存儲在方法區(qū)
    public String loadData() {
        return "abc";
    }
}

jvm,JVM,操作系統(tǒng),jvm,java,面試

四、JVM運(yùn)行數(shù)據(jù)區(qū)各部分特點(diǎn)及作用

  1. ??堆用來存放對象和數(shù)組,只要是堆中的對象,就可以被所有線程共享(靜態(tài)變量、靜態(tài)常量、字符串存儲在堆中的老年代里)。Java7 版本中將永久代的靜態(tài)變量和運(yùn)行時常量池轉(zhuǎn)移到堆中存放的。
    ??
    ??堆是 JVM 上最大的內(nèi)存區(qū)域。垃圾回收操作的對象就是堆。
    ??
    ??堆空間一般是程序啟動時就申請了,一般設(shè)置成可伸縮的。 隨著對象的頻繁創(chuàng)建,堆空間占用的越來越多,就需要不定期的對不再使用的對象進(jìn)行回收,這就是GC。
    ??
    ?? 對于基本數(shù)據(jù)類型對象(如byte、short、int、long、float、double、char),在方法體內(nèi)聲明時,會直接分配在棧中,其它情況都會分配在堆中。
    ??
    ??對于普通對象來說,JVM 會首先在堆上創(chuàng)建對象,然后在其他地方使用它的引用。比如,把這個引用保存在虛擬機(jī)棧的局部變量表中。但是在開啟了逃逸分析時,如果發(fā)現(xiàn)某個對象只會在方法內(nèi)部使用,則可能會將該對象經(jīng)過標(biāo)量替換后也存在棧中。
    ??
    堆的幾個重要參數(shù):
    ??-Xms:堆的最小值(初始值,默認(rèn)單位是:字節(jié),要求是1024的整數(shù)倍);
    ??-Xmx:堆的最大值;
    ??-Xmn:新生代的大??;
    ??-XX:NewSize;新生代最小值(初始值);
    ??-XX:MaxNewSize:新生代最大值;

2.虛擬機(jī)棧
?? Java虛擬機(jī)棧是當(dāng)前線程在執(zhí)行方法時存儲所需的數(shù)據(jù)、指令、返回地址的一種棧結(jié)構(gòu)(先進(jìn)后出)。它的生命周期與線程保持一致。提一句:靜態(tài)變量不入棧。
??
?? 每調(diào)用一個方法就會在棧里加入一個棧幀。調(diào)用的方法執(zhí)行完了,對應(yīng)的棧幀就會出棧。棧幀里分為4個區(qū)域,這4個區(qū)域就包含了執(zhí)行Java方法時的全部內(nèi)容。這個4個區(qū)域分別是:局部變量表、操作數(shù)棧、動態(tài)連接、方法出口。
jvm,JVM,操作系統(tǒng),jvm,java,面試
虛擬機(jī)棧默認(rèn)1M。 如果我們不斷的往虛擬機(jī)棧中入棧幀,但是就是不出棧的話,那么這個虛擬機(jī)棧就會溢出。

3.程序計數(shù)器
?? 由于現(xiàn)在都是多線程運(yùn)行,而一個CPU在同一時刻只能運(yùn)行一個線程,多個線程只能交替運(yùn)行。程序計數(shù)器的作用就是記錄當(dāng)前線程下一條要運(yùn)行的指令,這樣保證了線程在切換回來時能回到正確的位置繼續(xù)開始執(zhí)行
?? 程序計算器是唯一不會發(fā)生內(nèi)存溢出的地方。如果正在執(zhí)行的是Native 方法,由于不是JVM執(zhí)行,則這個計數(shù)器值為空(Undefined)

4.方法區(qū)(元空間)
?? 方法區(qū)也是一個線程共享的內(nèi)存區(qū)。
??
?? 方法區(qū)存儲的內(nèi)容有:類型信息(比如類全稱、父類全稱)、域信息(域名稱、域修飾符private等)、方法信息(方法名稱、方法修飾符、返回類型等)、字面量(字面量包括文本字符串、八種基本類型的值 、被聲明為final的常量等)。
??
??假如兩個線程都試圖訪問方法區(qū)中的同一個類信息,而這個類還沒有加載進(jìn) JVM,那么此時就只允許一個線程去加載它,另一個線程必須等待。
??
??方法區(qū)是 JVM 對內(nèi)存的“邏輯劃分”,在 JDK1.7 及之前將方法區(qū)稱為“永久代”,是因為在 HotSpot 虛擬機(jī)中,設(shè)計人員使用了永久代來實現(xiàn)了 JVM 規(guī)范的方法區(qū)。在 JDK1.8 及以后使用了元空間來實現(xiàn)方法區(qū)。
??
??Java8 使用元空間替代永久代,是為了融合 HotSpot JVM 與 JRockit VM ,因為 JRockit 沒有永久代。
??
??元空間大小參數(shù)設(shè)置:
??jdk1.7 及以前:-XX:PermSize;-XX:MaxPermSize;
??jdk1.8 以后:-XX:MetaspaceSize; -XX:MaxMetaspaceSize ;如果不設(shè)置參數(shù),則只受本機(jī)總內(nèi)存的限制文章來源地址http://www.zghlxwxcb.cn/news/detail-627097.html

到了這里,關(guān)于【JVM】JVM內(nèi)存模型詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java高級應(yīng)用:深入探索Java編程的強(qiáng)大功能,JVM 類加載機(jī)制, JVM 內(nèi)存模型,垃圾回收機(jī)制,JVM 字節(jié)碼執(zhí)行,異常處理機(jī)制】

    本人詳解 作者:王文峰,參加過 CSDN 2020年度博客之星,《Java王大師王天師》 公眾號:JAVA開發(fā)王大師,專注于天道酬勤的 Java 開發(fā)問題 中國國學(xué)、傳統(tǒng)文化和代碼愛好者的程序人生,期待你的關(guān)注和支持!本人外號:神秘小峯 山峯 轉(zhuǎn)載說明:務(wù)必注明來源(注明:作者:

    2024年01月16日
    瀏覽(27)
  • 區(qū)分什么是Java內(nèi)存模型(JMM)和 JVM運(yùn)行時數(shù)據(jù)區(qū)

    區(qū)分什么是Java內(nèi)存模型(JMM)和 JVM運(yùn)行時數(shù)據(jù)區(qū)

    Java的內(nèi)存區(qū)域和內(nèi)存模型是不一樣的東西,內(nèi)存區(qū)域是指 JVM 運(yùn)行時將數(shù)據(jù)分區(qū)域存儲,強(qiáng)調(diào)對內(nèi)存空間的劃分 。 而內(nèi)存模型(Java Memory Model,簡稱 JMM )是 定義了線程和主內(nèi)存之間的抽象關(guān)系,即 JMM 定義了 JVM 在計算機(jī)內(nèi)存(RAM)中的工作方式 ,如果我們要想深入了解Java并

    2024年02月11日
    瀏覽(31)
  • jvm 程序計算器 程序計數(shù)器是否溢出 程序計數(shù)器是做什么的 java程序計數(shù)器會內(nèi)存溢出嗎 程序計數(shù)器作用與用處 jvm內(nèi)存模型 jvm合集(一)

    jvm 程序計算器 程序計數(shù)器是否溢出 程序計數(shù)器是做什么的 java程序計數(shù)器會內(nèi)存溢出嗎 程序計數(shù)器作用與用處 jvm內(nèi)存模型 jvm合集(一)

    1. jvm內(nèi)存模型: ??? 內(nèi)存模型: ??????????????????? 程序計數(shù)器 ??????????????????? 堆 ??????????????????? 棧 ??????????????????? 本地方法棧 ??????????????????? 方法區(qū) 2. java代碼編譯為class文件,由類加載器加載到j(luò)vm,然后

    2024年02月09日
    瀏覽(20)
  • 【JVM】JVM內(nèi)存模型(詳細(xì))

    【JVM】JVM內(nèi)存模型(詳細(xì))

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機(jī),是通過在實際的計算機(jī)上仿真模擬各種計算機(jī)功能來實現(xiàn)的。 Java中的所有類,必須被裝載到JVM中才能運(yùn)行,這個裝載工作是由jvm中的類裝載器完成的,.class這個類型可以

    2023年04月08日
    瀏覽(23)
  • JVM前世今生之JVM內(nèi)存模型

    JVM前世今生之JVM內(nèi)存模型

    JVM內(nèi)存模型所指的是JVM運(yùn)行時區(qū)域,該區(qū)域分為兩大塊 線程共享區(qū)域 堆內(nèi)存、方法區(qū),即所有線程都能訪問該區(qū)域,隨著虛擬機(jī)和GC創(chuàng)建和銷毀 線程獨(dú)占區(qū)域 虛擬機(jī)棧、本地方法棧、程序計數(shù)器,即每個線程都有自己獨(dú)立的區(qū)域,該區(qū)域隨著線程的生命周期創(chuàng)建和銷毀 ?

    2024年02月12日
    瀏覽(34)
  • JVM原理:JVM運(yùn)行時內(nèi)存模型(通俗易懂)

    JVM原理:JVM運(yùn)行時內(nèi)存模型(通俗易懂)

    做了幾年開發(fā),平時除了寫代碼造BUG和修復(fù)BUG之外,偶爾也會遇到反饋說程序較慢問題,要對程序性能排查與優(yōu)化就得更深入學(xué)習(xí),學(xué)習(xí)JVM可以幫助我們加深對JAVA的理解,讓我們具備一定的性能排查與調(diào)優(yōu)的能力,無非就是讓程序別太卡或者別掛了,那掛了目前我遇到的主要

    2024年02月08日
    瀏覽(34)
  • 【JVM】JVM堆內(nèi)存(heap)詳解

    【JVM】JVM堆內(nèi)存(heap)詳解

    JAVA堆內(nèi)存管理是影響性能主要因素之一。 堆內(nèi)存溢出是JAVA項目非常常見的故障,在解決該問題之前,必須先了解下JAVA堆內(nèi)存是怎么工作的。 先看下JAVA堆內(nèi)存是如何劃分的,如圖: JVM內(nèi)存劃分為堆內(nèi)存和非堆內(nèi)存,堆內(nèi)存分為年輕代(Young Generation)、老年代(Old Generatio

    2024年02月09日
    瀏覽(21)
  • 認(rèn)識JVM的內(nèi)存模型

    認(rèn)識JVM的內(nèi)存模型

    從上一節(jié)了解到整個JVM大的內(nèi)存區(qū)域,分為線程共享的heap(堆),MethodArea(方法區(qū)),和線程獨(dú)享的 The pc Register(程序計數(shù)器)、Java Virtual Machine Stacks(Java虛擬機(jī)棧)、Native Method Stacks(本地方法棧),如下圖 同時也大概了解到各個內(nèi)存區(qū)域主要存儲的數(shù)據(jù)類型,根據(jù)之前

    2024年02月10日
    瀏覽(69)
  • JVM學(xué)習(xí)05:內(nèi)存模型

    JVM學(xué)習(xí)05:內(nèi)存模型

    很多人將 java 內(nèi)存結(jié)構(gòu) 與 java 內(nèi)存模型 傻傻分不清,java 內(nèi)存模型是 **Java Memory Model(JMM)**的意思。 JMM 定義了一套在多線程讀寫共享數(shù)據(jù)時(成員變量、數(shù)組)時,對數(shù)據(jù)的可見性、有序性、和原子性的規(guī)則和保障。 原子性是指一個操作是 不可中斷 的。即使在多個線程一

    2024年02月04日
    瀏覽(21)
  • JVM——內(nèi)存模型

    JVM——內(nèi)存模型

    ? 這里與局部變量自增不同,局部變量調(diào)用iinc是在局部變量表槽位上進(jìn)行自增。? 靜態(tài)變量是在操作數(shù)棧自增。 這里的主內(nèi)存和工作內(nèi)存時再JMM里的說法。 ?因為操作系統(tǒng)是時間片切換的多個線程輪流使用CPU. JMM中通過synchronized(同步)保證原子性。 使用synchronized減i+

    2024年02月11日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包