亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java中JVM中如何存取數(shù)據(jù)和相關(guān)信息詳解

 更新時(shí)間:2019年06月19日 16:06:42   作者:易水人去丶明月如霜  
這篇文章主要介紹了JVM中如何存取數(shù)據(jù)和相關(guān)信息詳解,Java源代碼文件(.java后綴)會(huì)被Java編譯器編譯為字節(jié)碼文件,然后由JVM中的類加載器加載各個(gè)類的字節(jié)碼文件,加載完畢之后,交由JVM執(zhí)行引擎執(zhí)行。JVM中怎么存取數(shù)據(jù)和相關(guān)信息呢?,需要的朋友可以參考下

前言:

我們每天都在編寫(xiě)Java代碼,編譯,執(zhí)行。很多人已經(jīng)知道Java源代碼文件(.java后綴)會(huì)被Java編譯器編譯為字節(jié)碼文件(.class后綴),然后由JVM中的類加載器加載各個(gè)類的字節(jié)碼文件,加載完畢之后,交由JVM執(zhí)行引擎執(zhí)行。

那在整個(gè)程序執(zhí)行過(guò)程中,JVM中怎么存取數(shù)據(jù)和相關(guān)信息呢?

事實(shí)上在JVM中是用一段空間來(lái)存儲(chǔ)程序執(zhí)行期間需要用到的數(shù)據(jù)和相關(guān)信息,這段空間一般被稱作為Runtime Data Area(運(yùn)行時(shí)數(shù)據(jù)區(qū)),也就是我們常說(shuō)的JVM內(nèi)存。

一、運(yùn)行時(shí)數(shù)據(jù)區(qū)域包括哪些?

根據(jù)《Java虛擬機(jī)規(guī)范》的規(guī)定,運(yùn)行時(shí)數(shù)據(jù)區(qū)通常包括這幾個(gè)部分:程序計(jì)數(shù)器(Program Counter Register)、Java虛擬機(jī)棧(Java Vitual Machine Stack)、本地方法棧(Native Method Stack)、方法區(qū)(Method Area)、堆(Heap)。

二、各個(gè)部分存儲(chǔ)的信息和負(fù)責(zé)的職能

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

這個(gè)內(nèi)存區(qū)域是Java虛擬機(jī)規(guī)范中唯一一個(gè)沒(méi)有規(guī)定任何OOM(OutOfMemoryError)情況的區(qū)域,這是這個(gè)區(qū)域最大的特點(diǎn)之一,這是因?yàn)槌绦蛴?jì)數(shù)器中存儲(chǔ)的數(shù)據(jù)所占空間的大小不會(huì)隨程序的執(zhí)行而發(fā)生改變,因此,對(duì)于程序計(jì)數(shù)器是不會(huì)發(fā)生內(nèi)存溢出現(xiàn)象(OutOfMemory)的。

這個(gè)區(qū)域主要是負(fù)責(zé)記錄正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址,即當(dāng)前線程執(zhí)行的字節(jié)碼的行號(hào)指示器(注意:JVM不是直接執(zhí)行Java代碼,而是執(zhí)行.class文件,所以只要其他編程語(yǔ)言能翻譯成.class文件一樣能放入JVM中執(zhí)行)。

JVM會(huì)給每個(gè)線程一個(gè)獨(dú)立的程序計(jì)數(shù)器,計(jì)數(shù)器之間互不影響,且通過(guò)線程輪流切換并且分配處理器執(zhí)行時(shí)間來(lái)實(shí)現(xiàn)JVM的多線程。不過(guò)當(dāng)線程執(zhí)行的是Native方法的時(shí)候這個(gè)計(jì)數(shù)器中的值為undefined。

2、Java虛擬機(jī)棧
和程序計(jì)數(shù)器一樣的是Java虛擬機(jī)棧是線程私有,生命周期和線程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的內(nèi)存模型:每個(gè)方法在執(zhí)行的時(shí)候都會(huì)創(chuàng)建棧幀,用來(lái)存儲(chǔ)局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息,每個(gè)方法從調(diào)用到執(zhí)行完成的過(guò)程,就對(duì)應(yīng)一個(gè)棧幀在虛擬機(jī)中入棧到出棧的過(guò)程,其中64位長(zhǎng)度的long和double類型的數(shù)據(jù)會(huì)占用2個(gè)局部變量空間,其余的數(shù)據(jù)類型只占用1個(gè)。

這里需要理解一下的就是為什么要用棧這個(gè)結(jié)構(gòu)呢,比如A方法中調(diào)用了B方法,虛擬機(jī)中是先讓A方法的棧幀進(jìn)入虛擬機(jī)棧執(zhí)行,當(dāng)執(zhí)行到調(diào)用B方法的語(yǔ)句就讓B棧幀進(jìn)入,執(zhí)行完之后B棧幀就出棧,A棧就繼續(xù)執(zhí)行。這里注意的是如果遞歸的方法遞歸的太深很容易拋出下面兩種異常,所以遞歸雖然寫(xiě)起來(lái)方便,但是性能會(huì)有所下降,并且容易拋出異常。

Java虛擬機(jī)規(guī)范中,對(duì)這個(gè)區(qū)域規(guī)定了兩種異常狀況

  • 線程請(qǐng)求棧的深度大于虛擬機(jī)所允許棧的深度,將拋出Stack Overflow Error
  • 如果虛擬機(jī)棧可以動(dòng)態(tài)擴(kuò)展且擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存,會(huì)拋出OutOfMemoryError

3、本地方法棧

與虛擬機(jī)棧作用相似,不過(guò)是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法提供,而本地方法為虛擬機(jī)使用到的Native方法服務(wù),Native方法多是用C++寫(xiě)的。拋出的異常和虛擬機(jī)棧相同。

4、Java堆

Java堆是與前面的區(qū)域不同的是:這個(gè)區(qū)域是被所有線程共享的一塊內(nèi)存區(qū)域,用來(lái)存放對(duì)象實(shí)例,并為對(duì)象實(shí)例分配好內(nèi)存。Java虛擬機(jī)規(guī)范中這樣描述:所有對(duì)象實(shí)例以及數(shù)組都要在堆上分配Java堆也是垃圾收集器管理的主要區(qū)域,也叫”GC堆“。由于現(xiàn)在的垃圾回收算法多是分代收集,所以Java堆里面又可分為:新生代和老年代。并且根據(jù)Java虛擬機(jī)規(guī)范的規(guī)定:Java堆可以處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上連續(xù)即可。有實(shí)例沒(méi)有被分配,且堆無(wú)法再擴(kuò)展的時(shí)候會(huì)拋出OutOfMemoryError異常,虛擬機(jī)調(diào)優(yōu)其實(shí)也主要關(guān)注的是這個(gè)區(qū)域。

5、方法區(qū)

與Java堆一樣,線程共享,用來(lái)存儲(chǔ)被虛擬機(jī)加載的類信息,常量,靜態(tài)變量。這個(gè)區(qū)域Java虛擬機(jī)規(guī)范對(duì)其特別寬松,既可以像Java堆那樣不需要連續(xù)內(nèi)存,又可以選擇固定大小和可擴(kuò)展。還可以選擇不實(shí)現(xiàn)垃圾收集,這個(gè)區(qū)域的內(nèi)存回收目標(biāo)主要是針對(duì)常量池的回收和對(duì)類型的卸載。當(dāng)無(wú)法滿足內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。

目前虛擬機(jī)Hotspot已經(jīng)將這部分存儲(chǔ)空間從使用JVM內(nèi)存換成使用本地內(nèi)存,即這部分不再叫永久代,而是元空間。這個(gè)元空間實(shí)際上是JVM動(dòng)態(tài)規(guī)定內(nèi)存大小。這個(gè)替換有什么優(yōu)勢(shì)呢?因?yàn)樽址A砍厥谴嬖谟谰么校苋菀壮霈F(xiàn)性能問(wèn)題,并且類和方法信息大小難確定,給永久代的的大小指定帶來(lái)困難,而且GC會(huì)對(duì)永久代特殊處理,這就增加了GC的復(fù)雜性。從JDK1.7開(kāi)始,字符串常量池就劃分進(jìn)了堆中,其他的更多是元空間在內(nèi)存劃分的算法上更趨于合理

6、運(yùn)行時(shí)常量池

是方法區(qū)的一部分。用于存放編譯期生成的各種字面量和符號(hào)引用,同時(shí)也會(huì)把翻譯出來(lái)的直接引用也存儲(chǔ)在運(yùn)行時(shí)的常量池中,具有動(dòng)態(tài)性。常量不一定只有編譯期才能產(chǎn)生,運(yùn)行期間也可以將新的常量放入池中。例如String的Intern()方法。同樣拋出OutOfMemoryError異常

三、直接內(nèi)存

這個(gè)區(qū)域并不是屬于運(yùn)行時(shí)數(shù)據(jù)區(qū)域,但是這個(gè)區(qū)域也會(huì)被頻繁使用,并且拋出OOM異常。這個(gè)區(qū)域主要是由于在JDK1.4中新加入了NIO(New Input/Output)類,引入了一種基于通道與緩沖區(qū)的I/O方式,它可以使用Native函數(shù)庫(kù)直接分配堆外內(nèi)存,通過(guò)一個(gè)儲(chǔ)存在Java堆中的DirectByteBuffer對(duì)象作為這塊內(nèi)存的引用進(jìn)行操作。

這樣能避免在Java堆和Native堆中來(lái)回復(fù)制數(shù)據(jù),從而在一些場(chǎng)景中顯著提高性能。直接內(nèi)存分配不會(huì)受到Java堆大小的限制,會(huì)受到本機(jī)總內(nèi)存大小及處理器尋址空間的限制。會(huì)拋出OutOfMemoryError異常

四、總結(jié)

只有程序計(jì)數(shù)器不會(huì)報(bào)出任何相關(guān)OOM異常,而Java虛擬機(jī)棧有可能會(huì)報(bào)出OOM或Stack Overflow異常。Java虛擬機(jī)棧主要是存儲(chǔ)方法的一些信息,能讓方法順利的執(zhí)行,而Java堆存儲(chǔ)的是對(duì)象的信息。虛擬機(jī)的垃圾回收算法主要在這一塊,并且平常調(diào)優(yōu)的區(qū)域也是在這一塊。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java線程組操作實(shí)例分析

    Java線程組操作實(shí)例分析

    這篇文章主要介紹了Java線程組操作,結(jié)合實(shí)例形式分析了ThreadGroup類創(chuàng)建與使用線程組相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • 使用mybatis的typeHandler對(duì)clob進(jìn)行流讀寫(xiě)方式

    使用mybatis的typeHandler對(duì)clob進(jìn)行流讀寫(xiě)方式

    這篇文章主要介紹了使用mybatis的typeHandler對(duì)clob進(jìn)行流讀寫(xiě)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring Security使用中Preflight請(qǐng)求和跨域問(wèn)題詳解

    Spring Security使用中Preflight請(qǐng)求和跨域問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于Spring Security使用中Preflight請(qǐng)求和跨域問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • 關(guān)于為何說(shuō)JAVA中要慎重使用繼承詳解

    關(guān)于為何說(shuō)JAVA中要慎重使用繼承詳解

    Java繼承是面向?qū)ο蟮淖铒@著的一個(gè)特征,然而下面這篇文章主要給大家介紹了關(guān)于為何說(shuō)JAVA中要慎重使用繼承的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • springboot集成WebSockets廣播消息(推薦)

    springboot集成WebSockets廣播消息(推薦)

    這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 基于ZooKeeper實(shí)現(xiàn)隊(duì)列源碼

    基于ZooKeeper實(shí)現(xiàn)隊(duì)列源碼

    這篇文章主要介紹了基于ZooKeeper實(shí)現(xiàn)隊(duì)列源碼的相關(guān)內(nèi)容,包括其實(shí)現(xiàn)原理和應(yīng)用場(chǎng)景,以及對(duì)隊(duì)列的簡(jiǎn)單介紹,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • 自己寫(xiě)的簡(jiǎn)易版Java日志類分享

    自己寫(xiě)的簡(jiǎn)易版Java日志類分享

    這篇文章主要介紹了自己寫(xiě)的簡(jiǎn)易版Java日志類分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-06-06
  • springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過(guò)程(連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試)

    springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過(guò)程(連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試)

    這篇文章主要介紹了springboot+idea+maven 多模塊項(xiàng)目搭建的詳細(xì)過(guò)程(連接數(shù)據(jù)庫(kù)進(jìn)行測(cè)試),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java可變參數(shù)的應(yīng)用小結(jié)

    Java可變參數(shù)的應(yīng)用小結(jié)

    這篇文章主要介紹了Java可變參數(shù)的應(yīng)用小結(jié),實(shí)現(xiàn)同一個(gè)函數(shù)名,不同參數(shù)個(gè)數(shù),實(shí)現(xiàn)的方法相同,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能

    Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能

    這篇文章主要介紹了Java實(shí)現(xiàn)注冊(cè)登錄與郵箱發(fā)送賬號(hào)驗(yàn)證激活功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12

最新評(píng)論