摘要:虛擬機(jī)執(zhí)行程序時(shí),會(huì)把虛擬機(jī)管理的內(nèi)存劃分成不同的區(qū)域,用于處理程序運(yùn)行過(guò)程中不同的數(shù)據(jù)。各個(gè)線程之間的程序計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ)。虛擬機(jī)棧線程私有每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀。
Java虛擬機(jī)執(zhí)行Java程序時(shí),會(huì)把虛擬機(jī)管理的內(nèi)存劃分成不同的區(qū)域,用于處理程序運(yùn)行過(guò)程中不同的數(shù)據(jù)。
程序計(jì)數(shù)器 線程私有對(duì)于一個(gè)處理器,只會(huì)執(zhí)行一個(gè)線程的指令。線程并不是一直獨(dú)享CPU的,多個(gè)線程通過(guò)切換的方式,實(shí)現(xiàn)一段時(shí)間內(nèi)的同時(shí)執(zhí)行。因此,為了線程切換后能恢復(fù)到切換前的執(zhí)行位置,每個(gè)線程都需要有個(gè)獨(dú)立的空間來(lái)記錄執(zhí)行位置,即程序計(jì)數(shù)器。各個(gè)線程之間的程序計(jì)數(shù)器互不影響,獨(dú)立存儲(chǔ)。
內(nèi)存空間小程序計(jì)數(shù)器中存儲(chǔ)的為當(dāng)前線程執(zhí)行的指令:
如果當(dāng)前執(zhí)行的是Java方法,程序計(jì)數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址
如果執(zhí)行的是Native方法,程序計(jì)數(shù)器記錄的值為空
沒(méi)有OutOfMemoryError情況唯一在虛擬機(jī)規(guī)范中沒(méi)有規(guī)定任何OutOfMemoryError情況的區(qū)域。
虛擬機(jī)棧 線程私有每個(gè)方法在執(zhí)行時(shí)都會(huì)創(chuàng)建一個(gè)棧幀。棧幀存儲(chǔ)了局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口等信息。方法從調(diào)用到執(zhí)行完成對(duì)應(yīng)了棧幀在虛擬機(jī)棧的入棧到出站過(guò)程。
StackOverflowError異常棧是有深度(大小)的,當(dāng)線程請(qǐng)求的棧深度大于了虛擬機(jī)允許的深度,則throw StackOverflowError。
OutOfMemoryError異常如果虛擬機(jī)棧可動(dòng)態(tài)擴(kuò)展,當(dāng)無(wú)法申請(qǐng)到足夠的內(nèi)存,則throw OutOfMemoryError。
堆堆是Java人員經(jīng)常提及的一塊內(nèi)存區(qū)域,也是關(guān)注最多的一塊區(qū)域。堆具有一下特點(diǎn):
通常是虛擬機(jī)管理的最大的一塊區(qū)域
被所有線程共享
垃圾收集器管理的主要區(qū)域
OutOfMemoryError異常
從內(nèi)存回收的角度來(lái)看,Java對(duì)可以分為新生代和老年代。
方法區(qū)方法區(qū)是所有線程共享的內(nèi)存區(qū)域,用來(lái)存儲(chǔ)已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。方法區(qū)無(wú)法滿足內(nèi)存分配需求時(shí),也會(huì)拋出OutOfMemoryError異常。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/69021.html
摘要:下面的截圖內(nèi)容來(lái)自從規(guī)范我們可以看到,規(guī)范要求的運(yùn)行時(shí)數(shù)據(jù)區(qū)域有程序計(jì)數(shù)器虛擬機(jī)棧堆方法區(qū)本地方法棧運(yùn)行時(shí)常量池這及部分。查了一下,還是沒(méi)有查到官方對(duì)于運(yùn)行時(shí)數(shù)據(jù)區(qū)域的說(shuō)明,但是許多博客都指出將字符串常量池移動(dòng)到了堆中。 不少java程序員一提JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)域,就會(huì)說(shuō)堆和棧,當(dāng)然也有java程序員給出方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計(jì)數(shù)器這個(gè)答案,但是還有人給出永久代、虛擬機(jī)...
摘要:框架說(shuō)明開(kāi)發(fā)者都知道會(huì)執(zhí)行字節(jié)碼。但是可能大多數(shù)人都不知道一個(gè)事實(shí)是的實(shí)現(xiàn),它分析字節(jié)碼,解釋并執(zhí)行代碼。執(zhí)行引擎字節(jié)碼加載到運(yùn)行時(shí)數(shù)據(jù)區(qū)后,會(huì)被執(zhí)行引擎執(zhí)行。解釋器更快的解釋字節(jié)碼,但是執(zhí)行非常慢。垃圾收集收集并移除不再被使用的對(duì)象。 JVM框架說(shuō)明 java開(kāi)發(fā)者都知道JRE(Java Runtime Environment)會(huì)執(zhí)行字節(jié)碼。但是可能大多數(shù)人都不知道一個(gè)事實(shí):JRE是...
摘要:而使用虛擬機(jī)是實(shí)現(xiàn)這一特點(diǎn)的關(guān)鍵。每個(gè)字節(jié)碼指令都由一個(gè)字節(jié)的操作碼和附加的操作數(shù)組成。字節(jié)碼可以通過(guò)以下兩種方式轉(zhuǎn)換成合適的語(yǔ)言解釋器一條一條地讀取,解釋并執(zhí)行字節(jié)碼執(zhí)行,所以它可以很快地解釋字節(jié)碼,但是執(zhí)行起來(lái)會(huì)比較慢。 一、什么是JVM JVM是Java Virtual Machine(Java 虛擬機(jī))的縮寫,JVM是一種用于計(jì)算設(shè)備的規(guī)范,它是一個(gè)虛構(gòu)出來(lái)的計(jì)算機(jī),是通過(guò)在實(shí)...
摘要:對(duì)字節(jié)碼文件進(jìn)行解釋執(zhí)行,把字節(jié)碼翻譯成相關(guān)平臺(tái)上的機(jī)器指令。使用命令可對(duì)字節(jié)碼文件以及配置文件進(jìn)行打包可對(duì)一個(gè)由多個(gè)字節(jié)碼文件和配置文件等資源文件構(gòu)成的項(xiàng)目進(jìn)行打包。和不存在永久代這種說(shuō)法。 Java技術(shù)體系 從廣義上講,Clojure、JRuby、Groovy等運(yùn)行于Java虛擬機(jī)上的語(yǔ)言及其相關(guān)的程序都屬于Java技術(shù)體系中的一員。如果僅從傳統(tǒng)意義上來(lái)看,Sun官方所定義的Jav...
摘要:方法區(qū)在實(shí)際內(nèi)存空間站可以是不連續(xù)的。這一規(guī)定,可以說(shuō)是給了虛擬機(jī)廠商很大的自由。但是值得注意的是,堆其實(shí)還未每一個(gè)線程單獨(dú)分配了一塊空間,這部分空間在分配時(shí)是線程獨(dú)享的,在使用時(shí)是線程共享的。 在我的博客中,之前有很多文章介紹過(guò)JVM內(nèi)存結(jié)構(gòu),相信很多看多我文章的朋友對(duì)這部分知識(shí)都有一定的了解了。 那么,請(qǐng)大家嘗試著回答一下以下問(wèn)題: 1、JVM管理的內(nèi)存結(jié)構(gòu)是怎樣的? 2、不同的...
摘要:編譯器只需面向,生成能理解的代碼或字節(jié)碼文件。源文件經(jīng)編譯器,編譯成字節(jié)碼程序,通過(guò)將每一條指令翻譯成不同平臺(tái)機(jī)器碼,通過(guò)特定平臺(tái)運(yùn)行。漲見(jiàn)識(shí),字節(jié)碼執(zhí)行過(guò)程分析。解決辦法減少默認(rèn)棧的容量來(lái)?yè)Q取更多的線程支持。 前言 JVM是java的核心和基礎(chǔ),在java編譯器和os平臺(tái)之間的虛擬處理器。它是一種基于下層的操作系統(tǒng)和硬件平臺(tái)并利用軟件方法來(lái)實(shí)現(xiàn)的抽象的計(jì)算機(jī),可以在上面執(zhí)行java的...
閱讀 1808·2021-11-23 09:51
閱讀 1268·2021-11-18 10:02
閱讀 963·2021-10-25 09:44
閱讀 2099·2019-08-26 18:36
閱讀 1619·2019-08-26 12:17
閱讀 1146·2019-08-26 11:59
閱讀 2746·2019-08-23 15:56
閱讀 3350·2019-08-23 15:05