小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JVM-----java內(nèi)存區(qū)域與java內(nèi)存模型

 印度阿三17 2019-02-25

一.java內(nèi)存區(qū)域

jvm在執(zhí)行java程序的過程中會把所管理的內(nèi)存分為若干不同的區(qū)域,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動而存在,有些區(qū)域則是依賴用戶線程的啟動和結(jié)束而建立和銷毀的。

以下是java運(yùn)行時(shí)內(nèi)存區(qū)域圖:

1.程序計(jì)數(shù)器

程序計(jì)數(shù)器是一塊較小的區(qū)域,它可以看做是當(dāng)前所執(zhí)行的字節(jié)碼的行號指示器。在java的多線程交互執(zhí)行的過程中,被中斷的線程當(dāng)前執(zhí)行到那條指令的內(nèi)存地址需要被保存下來,以便于該中斷線程恢復(fù)執(zhí)行的時(shí)候可以按照被中斷時(shí)的指令繼續(xù)執(zhí)行下去。

為了能使每個(gè)線程切換后都能恢復(fù)到正確的位置,因此每一個(gè)線程都是需要有自己的程序計(jì)數(shù)器。每個(gè)線程獨(dú)立存儲,互不影響,因此我們成這個(gè)內(nèi)存為“線程私有”的內(nèi)存。

2.java虛擬機(jī)棧

每當(dāng)創(chuàng)建一個(gè)線程,jvm就會為該線程創(chuàng)建一個(gè)java虛擬機(jī)棧,虛擬機(jī)棧的生命周期與線程相同,它隨線程的創(chuàng)建與結(jié)束而啟動和銷毀的。該線程每調(diào)用一個(gè)方法,jvm就會在該虛擬機(jī)棧中創(chuàng)建一個(gè)棧幀,用于存放局部變量表,操作數(shù)棧,接口信息等。每一個(gè)方法的從調(diào)用到完成的過程就對應(yīng)一個(gè)棧幀在虛擬機(jī)棧中的入棧以及出棧的過程。正在執(zhí)行的方法的棧幀位于棧頂。

虛擬機(jī)棧的這個(gè)內(nèi)存區(qū)域?yàn)?線程私有"的內(nèi)存。

該區(qū)域可拋出兩種異常情況:

  • StackOverflowError異常:線程請求的棧的深度大于了虛擬機(jī)所允許的深度。

  • OutOfMemoryError異常:虛擬機(jī)棧東塔擴(kuò)展時(shí)無法申請到足夠長度。

3.本地方法棧

本地方法棧和Java棧所發(fā)揮的作用非常相似,區(qū)別不過是Java棧為JVM執(zhí)行Java方法服務(wù),而本地方法棧為JVM執(zhí)行Native方法服務(wù)。 本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。

本地方法棧的這個(gè)內(nèi)存區(qū)域?yàn)?線程私有"的內(nèi)存。

4.java堆

堆是JVM所管理的內(nèi)存中國最大的一塊,是被所有Java線程鎖共享的,不是線程安全的,在JVM啟動時(shí)創(chuàng)建。堆是存儲Java對象的地方,這一點(diǎn)Java虛擬機(jī)規(guī)范中描述是:所有的對象實(shí)例以及數(shù)組都要在堆上分配。Java堆是GC管理的主要區(qū)域,從內(nèi)存回收的角度來看,由于現(xiàn)在GC基本都采用分代收集算法,所以Java堆還可以細(xì)分為:新生代和老年代;新生代再細(xì)致一點(diǎn)有Eden空間、From Survivor空間、To Survivor空間等。

5.方法區(qū)

方法區(qū)用于存儲已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量即編譯后的代碼以及數(shù)據(jù)。

在方法區(qū)中存在一部分內(nèi)存稱為“運(yùn)行時(shí)常量區(qū)”,用于存放編譯器生成的各種字面量以及符號引用量?!酒渲?,字面量就是指final變量等;引用變量包括類和接口的全限定名,字段名稱,方法名和描述符】

方法區(qū)為java線程共享

當(dāng)方法區(qū)無法滿足內(nèi)存需求的時(shí)候,將拋出OutOfMemoryError異常。

二.java內(nèi)存模型

1. java內(nèi)存模型(java Memory Model , JMM)就是一種符合內(nèi)存模型規(guī)范的,屏蔽了各種硬件和操作系統(tǒng)的訪問差異的,保證了java程序在各種平臺下對內(nèi)存訪問都能保證一致的機(jī)制及規(guī)范。

** 2. **Java內(nèi)存模型規(guī)定了所有的變量都存儲在主內(nèi)存中,每條線程還有自己的工作內(nèi)存,線程的工作內(nèi)存中保存了該線程中是用到的變量的主內(nèi)存副本拷貝,線程對變量的所有操作都必須在工作內(nèi)存中進(jìn)行,而不能直接讀寫主內(nèi)存。不同的線程之間也無法直接訪問對方工作內(nèi)存中的變量,線程間變量的傳遞均需要自己的工作內(nèi)存和主存之間進(jìn)行數(shù)據(jù)同步進(jìn)行。

如:線程1 要與 線程2 進(jìn)行數(shù)據(jù)交換,首先,線程1要把自己工作內(nèi)存1中的數(shù)據(jù)更新保存到主內(nèi)存中,然后線程2要去主內(nèi)存中拷貝一份數(shù)據(jù),刷新到自己的工作線程2之中。

3.java內(nèi)存模型是圍繞著并發(fā)編程中的原子性,可見性,有序性這三個(gè)特征來建立的。

  • 原子性:一個(gè)操作要么不執(zhí)行,要么全部執(zhí)行完畢,不能被打斷。

  • 可見性:一個(gè)線程對共享變量做了修改之后,其他的線程立即能夠看到該變量的變化。

  • 有序性:在本線程內(nèi)觀察,所有的操作都是無序的;如果在一個(gè)線程中觀察另一個(gè)線程,所有的操作都是無序的。前半句是指“線程內(nèi)表現(xiàn)為串行語義”,后半句是指“指令重排”現(xiàn)象以及“工作內(nèi)存與主內(nèi)存同步延遲”現(xiàn)象。

4.總結(jié):JMM是一種規(guī)范,目的是解決由于多線程通過共享內(nèi)存進(jìn)行通信時(shí),存在的本地內(nèi)存數(shù)據(jù)不一致、編譯器會對代碼指令重排序、處理器會對代碼亂序執(zhí)行等帶來的問題。目的是保證并發(fā)編程場景中的原子性、可見性和有序性。

注:主內(nèi)存和工作內(nèi)存與JVM內(nèi)存結(jié)構(gòu)中的Java堆、棧、方法區(qū)等并不是同一個(gè)層次的內(nèi)存劃分,無法直接類比。

歡迎大家加入交流群:956058372,群內(nèi)免費(fèi)分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服務(wù)、Dubbo框架、Redis緩存、RabbitMq消息、JVM調(diào)優(yōu)、Tomcat容器、MySQL數(shù)據(jù)庫教學(xué)視頻及架構(gòu)學(xué)習(xí)思維導(dǎo)圖


來源:http://www./content-3-123251.html

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多