Java運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分原理解析
Java中對(duì)象創(chuàng)建,內(nèi)存分配,垃圾回收的權(quán)力交給了虛擬機(jī),這其中有利也有弊,程序員也減輕了負(fù)擔(dān),但是如果不熟悉Java的內(nèi)存區(qū)域劃分,一旦出現(xiàn)內(nèi)存溢出和泄漏,將會(huì)很難定位問(wèn)題的根源,這就有必要了解Java的運(yùn)行時(shí)數(shù)據(jù)區(qū)劃分。

方法區(qū)(Method Area)
是由各個(gè)線程共享的內(nèi)存區(qū)域,用來(lái)存儲(chǔ)已被虛擬機(jī)加載的類型信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù)。
堆(Heap)
Java虛擬機(jī)所管理的一塊最大的內(nèi)存區(qū)域,由所有的線程共享的一塊內(nèi)存區(qū)域;堆內(nèi)存在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建,用來(lái)存放對(duì)象實(shí)例,數(shù)組;Java堆是垃圾收集器管理的內(nèi)存,在G1垃圾收集器之前,堆內(nèi)存普遍采用分代設(shè)計(jì)思想,新生代,老年代,永久代...,現(xiàn)代垃圾收集器已經(jīng)不主張采用分代設(shè)計(jì)理論概念;Java堆既可以被實(shí)現(xiàn)成固定大小的,也可以是可擴(kuò)展的,不過(guò)當(dāng)前主流的Java虛擬機(jī)都是按照可擴(kuò)展來(lái)實(shí)現(xiàn)的(通過(guò)參數(shù)-Xmx和-Xms設(shè)定)。如果在Java堆中沒(méi)有內(nèi)存完成實(shí)例分配,并且堆也無(wú)法再擴(kuò)展時(shí),Java虛擬機(jī)將會(huì)拋出OutOfMemoryError異常。
虛擬機(jī)棧(VM Stack)
虛擬機(jī)棧為線程私有,每個(gè)方法執(zhí)行時(shí),虛擬機(jī)都會(huì)創(chuàng)建棧幀存儲(chǔ)局部變量表(包含Java的基本數(shù)據(jù)類型,以及對(duì)象的引用,非對(duì)象本身)、操作數(shù)棧、動(dòng)態(tài)連接方法出口等信息,方法從被調(diào)用到執(zhí)行結(jié)束,對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)中從入棧到出棧的過(guò)程。基本數(shù)據(jù)類型在局部變量表中的存儲(chǔ)空間以局部變量槽(slot)來(lái)表示,64位長(zhǎng)度的long和double占用兩個(gè)變量槽,其余數(shù)據(jù)類型占用一個(gè),局部變量表所需要的內(nèi)存空間在編譯期完成,因此進(jìn)入方法時(shí),每個(gè)方法在棧幀需要分配的空間時(shí)確定的,運(yùn)行期間并不會(huì)改變局部變量表的大?。醋兞坎鄣臄?shù)量),每個(gè)槽的空間大小根據(jù)虛擬機(jī)的實(shí)現(xiàn)而定。
如果線程請(qǐng)求的棧深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常;如果Java虛擬機(jī)棧容量可以動(dòng)態(tài)擴(kuò)展[2],當(dāng)棧擴(kuò)展時(shí)無(wú)法申請(qǐng)到足夠的內(nèi)存會(huì)拋出OutOfMemoryError異常。
本地方法棧(Native Method Stack)
類似于虛擬機(jī)棧的作用,區(qū)別在于虛擬機(jī)棧用來(lái)執(zhí)行Java的方法,本地方法棧為虛擬機(jī)使用到的笨的方法服務(wù)。
程序計(jì)數(shù)器(Program Counter Register)
是Java內(nèi)存中較小的一部分內(nèi)存空間,由每個(gè)Java線程所獨(dú)享,可以理解為當(dāng)前線程執(zhí)行的字節(jié)碼行號(hào)指示器,Java中程序的執(zhí)行往往是多線程的,在某一個(gè)確切的時(shí)刻,一個(gè)處理器內(nèi)核直會(huì)執(zhí)行線程中的一條指令,每個(gè)線程都是在不停的切換執(zhí)行,為了保證切換后可以執(zhí)行到正確的位置,每個(gè)線程都要有一個(gè)獨(dú)立的程序計(jì)數(shù)器,每個(gè)計(jì)數(shù)器之間互不影響。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java內(nèi)存模型與JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)的區(qū)別詳解
- Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域匯總
- Java運(yùn)行時(shí)數(shù)據(jù)區(qū)概述詳解
- java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)分析
- 深入理解Java運(yùn)行時(shí)數(shù)據(jù)區(qū)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- 詳解Java虛擬機(jī)管理的內(nèi)存運(yùn)行時(shí)數(shù)據(jù)區(qū)域
相關(guān)文章
IntelliJ IDEA下載GitHub私有倉(cāng)庫(kù)到本地的方法(新版)
這篇文章主要介紹了IntelliJ IDEA下載GitHub私有倉(cāng)庫(kù)到本地(新版),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問(wèn)題及解決方法
這篇文章主要介紹了SpringBoot對(duì)Druid配置SQL監(jiān)控功能失效問(wèn)題的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
MyBatis動(dòng)態(tài)SQL標(biāo)簽用法實(shí)例詳解
本文通過(guò)實(shí)例代碼給大家介紹了MyBatis動(dòng)態(tài)SQL標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-07-07
關(guān)于Java中如何實(shí)現(xiàn)文件的讀寫操作
在Java中,可以使用File和FileInputStream、FileOutputStream、BufferedReader、PrintWriter等類來(lái)進(jìn)行文件讀寫操作,需要的朋友可以參考下2023-05-05
Java8利用Stream實(shí)現(xiàn)列表去重的方法詳解
這篇文章主要為大家介紹了Java利用Stream實(shí)現(xiàn)列表去重的幾種方法詳解,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下2022-04-04
java實(shí)現(xiàn)/創(chuàng)建線程的幾種方式小結(jié)
在JAVA中,用Thread類代表線程,所有線程對(duì)象都必須是Thread類或者Thread類子類的實(shí)例,下面這篇文章主要介紹了java實(shí)現(xiàn)/創(chuàng)建線程的幾種方式,需要的朋友可以參考下2021-08-08
java開(kāi)發(fā)MVC三層架構(gòu)上再加一層Manager層原理詳解
這篇文章主要為大家介紹了MVC三層架構(gòu)中再加一層Manager層原理的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
關(guān)于Unsupported major.minor version 49.0的錯(cuò)誤解決辦法
這篇文章主要介紹了關(guān)于Unsupported major.minor version 49.0的錯(cuò)誤解決辦法的相關(guān)資料,需要的朋友可以參考下2015-11-11

