1. 程式人生 > >JVM記憶體管理之記憶體結構

JVM記憶體管理之記憶體結構

JVM在執行java程式時,將他們劃分成幾種不同格式的資料,分別儲存在不同的區域,這些資料統一稱為執行時資料。主要分為以下6種儲存結構。

1、PC暫存器資料;
2、Java棧;
3、堆;
4、方法區;
5、本地方法區;
6、執行時常量;

一:PC暫存器

pc暫存器用於儲存當前正常執行的程式的記憶體地址。
java程式是多執行緒執行的,當對個執行緒交叉執行時,被中斷執行緒的程式當前執行到那條地址的記憶體地址必然要儲存下來,以便於他被恢復時再按照中斷時的指令地址繼續執行下去

二:Java棧

java棧是和執行緒關聯在一起的,每建立一個java執行緒,JVM就會為這個執行緒建立一個對應的棧,在java棧中會有多個棧,棧針是和方法關聯起來的。棧針中會包含一些內部變數,操作棧和方法返回值等資訊。
java棧的棧頂的棧針是當前正在執行的活動棧,也就是當前正在執行的方法,PC暫存器會指向這個地址。當這個棧針中呼叫另一個方法是,這個棧針將被壓棧新的棧針將被放到棧的頂部,變為活動棧,當這個棧中的指令執行完成時,這個棧針將被彈出,下一個棧針將變為活動棧,上一個棧針的返回值將變為這個棧的變數使用。

三:堆

堆是儲存java物件的地方,它是JVM管理Java物件的核心儲存區域。堆是被所有java執行緒共享的,所以對他的訪問需要注意同步問題,方法和對應的屬性都需要保證一致性。

四:方法區

JVM方法區是用於儲存類結構資訊的地方,當類被載入到JVM時,會被儲存在不同的資料結構中,包括常量池,域,,方法資料,方法體,建構函式,包括類中的專用方法,例項初始化,介面初始化,等。

五:執行時常量池

六:本地方法棧

相關推薦

JVM記憶體管理記憶體結構

JVM在執行java程式時,將他們劃分成幾種不同格式的資料,分別儲存在不同的區域,這些資料統一稱為執行時資料。主要分為以下6種儲存結構。 1、PC暫存器資料; 2、Java棧; 3、堆; 4、方法區; 5、本地方法區; 6、執行時常量; 一:PC暫存器

Java記憶體管理記憶體洩露是什麼?什麼情況下會導致記憶體洩露?

文章目錄 1. 靜態類的使用 2. 資源連線的使用 3. 監聽器的使用 雖然Java擁有垃圾回收機制,但同樣會出現記憶體洩露問題,我們說一下比較主要的三種情況。 1. 靜態類的使用 諸如 HashMap、Vector 等集

php記憶體管理記憶體分配

鑑於系統開銷的呼叫,一些對效能有要求的應用通常會在自己的使用者態進行記憶體管理,比如在第一次申請一塊較大的記憶體留著 備用,而不是使用完馬上還給作業系統,可以進行復用,避免多次申請和釋放帶來的開銷。 一般讀取超大檔案到記憶體、超大陣列、大迴圈記憶體沒有釋放等都會出現記憶體佔

Java記憶體管理JVM 記憶體劃分

JVM 記憶體劃分 方法區(執行緒共享):常量、靜態變數、JIT(即時編譯器) 編譯後的程式碼也都在方法區; 堆記憶體(執行緒共享):垃圾回收的主要場所; 程式計數器: 當前執行緒執行的位元組碼的位置指示器; 虛擬機器棧(棧記憶體):儲存區域性變數、基本資料

Java記憶體管理Java堆結構是怎麼樣的?裡面有什麼東西?

文章目錄 1. 剛剛建立的物件 2. 存活了一段時間的物件 3. 永久存在的物件 一塊 Java 堆空間一般分成三部分,這三部分用來儲存三類資料:新生代、老年代、永久代。 1. 剛剛建立的物件 在程式碼執行時會持續不斷地創

C++記憶體管理結構記憶體釋放

    C++中使用new和delete申請和釋放記憶體空間,二者是成對出現的,缺一不可。使用new開闢的記憶體空間位於堆中,只能通過delete釋放,這與區域性變數不同,區域性變數儲存在棧中,變數生存週期結束後其記憶體也隨之釋放。     結構體中成員變數中存在指標的,其

初探jvm虛擬機器記憶體管理(一)

本篇記錄一些概念性的東西,後續結合例項分析虛擬機器的記憶體機制。java虛擬機器在程式執行時將記憶體劃分為以下幾個區域,每個區域作用,生命週期各不相同程式計數器 虛擬機器棧 本地方法棧 方法區 堆程式計數器 執行緒執行的位元組碼行號指示器。 多執行緒是通過時間片輪轉法獲取cp

記憶體管理結構

記憶體管理之結構體 資料結構這門學問的意義       資料結構就是研究資料如何組織(在記憶體中排布),如何加工的學間。... 4.1.6.2、最簡單的資料結構:陣列     &nb

C++小知識——記憶體管理智慧指標

在C++中,動態記憶體的管理是通過一對運算子來完成的: 1)new:在動態記憶體中為物件分配空間並返回一個指向該物件的指標 2)delete:接受一個動態物件的指標,銷燬該物件,並釋放與之關聯的記憶體 因為這樣的原因,我們時常很難確保在正確的時間去釋放記憶體,甚至我們忘記了去釋放記憶體,這

Android面試系列文章2018記憶體管理UI卡頓篇

Android面試系列文章2018之記憶體管理之UI卡頓篇 1.UI卡頓的原理   60ftp –> 16ms: Android系統每隔16ms都會對介面進行渲染一次,造成卡頓的原因就是Android系統在渲染的時候丟幀了, 16ms = 1000/60hz,相當於60fps

Linux記憶體管理malloc實現

程序虛擬地址空間由一個一個VMA來表示,這裡先接收VMA相關操作. 1.1 查詢VMA函式find_vma() struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr) 找到的vma結果需滿足條件:

Linux 記憶體管理vmalloc實現

vmalloc最小分配一個page.並且分配到的頁面不保證是連續的.因為vmalloc內部呼叫alloc_page多次分配單個頁面. vmalloc主要內容: 1. 從VMALLOC_START到VMALLOC_END查詢空閒的虛擬地址空間(hole) 2.根據分配的size,呼叫all

Linux記憶體描述記憶體節點node--Linux記憶體管理(二)

1 記憶體節點node 1.1 為什麼要用node來描述記憶體 這點前面是說的很明白了, NUMA結構下, 每個處理器CPU與一個本地記憶體直接相連, 而不同處理器之前則通過匯流排進行進一步的連線, 因此相對於任何一個CPU訪問本地記憶體的速度比訪問遠端記憶體的速度要快 Linux適用於各種不同的體系結

Java記憶體管理類似-Xms、-Xmx 這些引數的含義

Java記憶體管理之類似-Xms、-Xmx 這些引數的含義 答: 1.堆記憶體分配: JVM 初始分配的記憶體由**-Xms** 指定,預設是實體記憶體的 1/64; JVM 最大分配的記憶體由**-Xmx** 指定,預設是實體記憶體的 1/4; 預設空餘

Linux記憶體描述記憶體區域zone--Linux記憶體管理(三)

1 記憶體管理域zone 為了支援NUMA模型,也即CPU對不同記憶體單元的訪問時間可能不同,此時系統的實體記憶體被劃分為幾個節點(node), 一個node對應一個記憶體簇bank,即每個記憶體簇被認為是一個節點 首先, 記憶體被劃分為結點. 每個節點關聯到系統中的一個處理器, 核心中表示為pg_

Linux記憶體描述記憶體頁面page--Linux記憶體管理(四)

1 Linux如何描述實體記憶體 Linux把實體記憶體劃分為三個層次來管理 層次 描述 儲存節點(Node) CPU被劃分為多個節點(node), 記憶體則被分簇, 每個CPU對應一個本地實體記憶體, 即一個CPU-node對應

初夏小談:記憶體管理常見記憶體錯誤(重點乾貨)

想來說說記憶體管理已經好長時間了,但是不知如何較好的表達。整理了幾天,來給大家分享這種底層問題。 學好C語言就要學好記憶體管理。那麼記憶體分為那幾個區呢? 先來說說記憶體中大致的這幾個區:棧區,堆區,全域性變數區,和程式碼區。 棧區:就是用來儲存區域性變數。棧上的

【軟體開發底層知識修煉】三 深入淺出處理器記憶體管理記憶體管理單元(MMU)

上一篇文章學習了中斷的概念與意義,以及中斷的應用-斷點除錯原理。點選連結複習上一篇文章:中斷的概念與意義 本片文章繼續學習處理器相關的知識-記憶體管理。包括:記憶體管理單元MMU的作用,虛擬記憶體與實體記憶體之間的對映方式,頁表的概念,快取記憶體(Cache)的作用,實體記憶體與快取

啟動期間的記憶體管理bootmem_init初始化記憶體管理–Linux記憶體管理(十二)

1. 啟動過程中的記憶體初始化 首先我們來看看start_kernel是如何初始化系統的, start_kerne定義在init/main.c?v=4.7, line 479 其程式碼很複雜, 我們只截取出其中與記憶體管理初始化相關的部分, 如下所示 table th:nth-of-type(1){

Java記憶體管理GC垃圾回收機制是什麼?什麼是垃圾?如何判斷是否為垃圾?

文章目錄 1. 垃圾回收機制是什麼? 2. 什麼是垃圾呢?如何判斷是否為垃圾呢? 3. GC root指的是誰? 1. 垃圾回收機制是什麼? 垃圾回收機制讓開發者無需關注空間的建立和釋放,而是以守護程序的形式在後臺自動回收垃圾