摘要:堆區堆是虛擬機所管理的內存中最大的一塊,它是被所有線程共享的一塊內存區域,該區域在虛擬機啟動的時候創建。
運行時數據區域
? ?想要了解jvm,那對其內存分配管理的學習是必不可少的;java虛擬機在執行java程序的時候會把它所管理的內存劃分成若干數據區域。這些區域有著不同的功能、用途、創建/銷毀時間。java虛擬機所分配管理的內存區域如圖1所示
程序計數器? ?程序計數器是一塊比較小的內存空間,它可以看做是當前線程所執行的字節碼的執行位置的指針。在虛擬機中字節碼,解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的指令;虛擬機完成分支、循環、跳轉、異常處理、線程恢復等功能都需要依靠它。
? ?我們知道jvm多線程是通過線程的輪流切換并分配處理器執行時間的的方式來實現的,在任何時刻,一個處理器都只會執行一條線程中的指令。為了使線程被切換后能恢復到正確的執行位置,每條線程的程序計數器都應該是獨立的,各條線程之間的計數器互不干涉,獨立存儲————程序計數器的內存區域為線程私有的內存。
? ?如果線程正在執行的是java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址;如果執行的是Native方法,這個計數器的值則為空。此內存區域是唯一一個在jvm規范中沒有規定任何OutOfMemoryerror情況的區域
? ?java虛擬機棧為線程私有的內存,其生命周期與線程相同。每個方法在執行的時候會創建一個棧幀用于存儲局部變量表、操作數棧、方法出口等信息。每一個方法從調用到執行完成,就對應著一個棧幀在虛擬機中從入棧到出棧的過程。其局部變量表存放了方法編譯期可知的各種基本數據類型、對象引用、returnAddress類型(指向一條字節碼指令的地址)jvm規范中,這個區域規定了兩種異常狀況:StackOverflowError和OutOfMemoryError。
本地方法棧? ?本地方法棧的作用和虛擬機棧的作用很相似,它們的區別在于虛擬機棧為虛擬機執行java方法服務,而本地方法棧則為執行本地方法服務。有的虛擬機直接把本地方法棧和虛擬機棧二合一。與虛擬機棧一樣,本地方法棧的異常也有兩個:StackOverflowError和OutOfMemoryError。
java堆區? ?java堆是虛擬機所管理的內存中最大的一塊,它是被所有線程共享的一塊內存區域,該區域在虛擬機啟動的時候創建。這個區域的唯一目的就是存放對象實例。java堆是垃圾收集器工作的主要區域,由于垃圾收集器基本都采用分代收集的算法,所以java堆從垃圾收集器的角度來劃分可以細分為新生代和老年代;從內存分配的角度來看,線程共享的java堆可能劃分出多個線程私有的分配緩沖區。
? ?java堆區可以是物理上不連續的內存空間,只要邏輯上是連續的即可;一般而言我們的虛擬機java堆內存不是固定大小的,是可以擴展的。如果在堆中沒有足夠內存分配給對象實例,并且堆內存無法再擴展時,虛擬機將會拋出OutOfMemoryError異常。
? ?方法區與java堆區一樣是各個線程共享的內存區域,這個區域存儲了類信息、常量、靜態變量等數據。java虛擬機規范中把方法區描述為堆得一部分邏輯,它又有一個名字——非堆,目的是與普通java堆進行區分。相對而言垃圾收集器在這個區域很少活動,因此一部分人把這個區域叫做“永久代”。這個區域的內存回收目標主要是針對常量池的回收和類型的卸載,然而類型卸載的條件是很苛刻的。該區域和和java堆區一樣,當內存不夠分配時會拋出OutOfMemoryError.
運行時常量池? ?運行時常量池是方法區的一部分;一個Class文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是編譯時常量池,用于存放編譯期生成的常量。編譯時常量池在類被加載后會放入方法區的運行時常量池中。與編譯期常量池不同的是,運運行時常量池是動態的,運行期間產生的新的常量也會被放入這個區域,如:String類的intern()方法。
小結? ?該篇對jvm內存只能算一個概覽,給小伙伴們介紹了一些概念性的東西,很多地方是值得去深入研究的,比如具體一個對象實例是如何被分配到堆內存的,類的加載過程,方法執行時方法棧的入棧與出棧的具體過程······。jvm博大精深,我在這提供一個梗概,小伙伴們如果有時間可以細細推敲推敲。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75499.html
摘要:整體流程以調試來演示服務的發布流程。暴露遠程服務假如服務沒有配置了屬性,或者配置了但是值不是,就會執行遠程暴露。封裝了一個服務的相關信息,是一個服務可執行體。是一個服務域,他是引用和暴露的主要入口,它負責的生命周期管理。 整體流程以調試 om.alibaba.dubbo.demo.provider.DemoProvider來演示dubbo服務的發布流程。 1、啟動Spring容器 參照...
摘要:虛擬機在執行程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,本篇文章將會對這些數據區域進行簡略的介紹。運行時常量池運行時常量池是方法區的一部分。直接內存直接內存不是虛擬機運行時數據區的一部分,不是虛擬機規范中定義的內存區域。 Java虛擬機在執行Java程序的過程中會把它所管理的內存劃分為若干個不同的數據區域,本篇文章將會對這些數據區域進行簡略的介紹。JVM所管理的內存包括的...
摘要:概述本篇旨在講清楚的內存分配策略,日志閱讀,一些常見名詞和提供的一些性能監控工具。內存分配與回收策略對象優先在分配大多數情況下,對象優先在新生代區中分配。當區域沒有足夠空間進行分配時,將發生一次。 概述 本篇旨在講清楚jvm的內存分配策略,gc日志閱讀,一些常見名詞和jdk提供的一些性能監控工具。廢話不多說,開始上貨。 GC日志閱讀 在開發的世界里,閱讀日志是最基礎的能力,也是解決問題...
摘要:內存區域虛擬機在運行程序時,會將其管理的內存區域劃分成若干個不同的數據區域。運行時常量池運行時常量池是方法區的一部分。另外一部分官方稱為用于存儲自身運行時的數據,比如哈希值年齡鎖狀態標志偏向線程等。 前言 最近一直在看周志明老師的《深入理解虛擬機》,總是看了忘,忘了又看,陷入這樣無休止的循環當中。抱著紙上得來終覺淺的想法,準備陸續的寫幾篇學習筆記,梳理知識的脈絡并強化一下對知識的掌握。...
閱讀 3371·2021-11-22 09:34
閱讀 2857·2021-10-09 09:43
閱讀 1445·2021-09-24 09:47
閱讀 2199·2019-08-30 12:53
閱讀 998·2019-08-29 14:00
閱讀 3356·2019-08-29 13:17
閱讀 2269·2019-08-28 18:00
閱讀 1284·2019-08-26 12:00