1. 程式人生 > >讀書筆記之初見JVM記憶體區域

讀書筆記之初見JVM記憶體區域

 初見JVM記憶體區域

      JVM一個重要的機制就是自動記憶體管理機制,為了深入理解JVM的記憶體管理機制,瞭解JVM的記憶體的分割槽以及各個分割槽的作用是基礎,本文主要總結java虛擬機器的記憶體區域分類以及各個記憶體區域的作用。

  java記憶體的分割槽及其作用

     

                            圖1 JVM記憶體的分割槽

       從圖1中可以知道,在劃分具體記憶體區域之前,可以依據記憶體是否是執行緒公有而進行一次大的劃分:

      (1)執行緒公有:所有的執行緒都公用的一塊記憶體區域,隨jvm的啟動而建立,隨jvm的銷燬而銷燬。執行緒公有的記憶體區域其生命週期和JVM的生命週期保持一致。

      (2)執行緒私有:執行緒私有的記憶體區域,其隨執行緒的建立而建立,隨執行緒的銷燬而銷燬,是每個執行緒都獨立擁有的一塊記憶體區域,其生命週期和執行緒保持一致,和jvm不保持一致。

      在瞭解了執行緒公有和執行緒私有的概念之後,逐一介紹各個記憶體區域的左右。

      1.程式計數器,這是一個最特殊的記憶體區域,存放了維護執行緒上下文切換所需要的資訊。其主要維護了一個指向當前執行指令的指標PC,當一個執行緒所擁有的時間片耗盡的時候會交出cpu的使用權,在退出之前通過PC指標記錄當前指令執行的位置,這樣在下一次獲得CPU分配的時間片後,通過PC指標可以繼續上次未完成的任務。

      2.虛擬機器棧,虛擬機器棧是開發中最常接觸的記憶體區域,比如在方法中定義的變數和引用都是存放在虛擬機器棧中。

     

                      圖 2 虛擬機器棧的記憶體結構

      對比圖2的虛擬機器棧記憶體結構,我們來介紹虛擬機器棧的作用:

      (1)每個方法,都對應一個幀棧,在方法中定義的變數和引用,以及其他的方法執行和呼叫資訊都存放在幀棧中

      (2)每呼叫一個方法,該方法對應的幀棧就被壓入虛擬機器棧中,當方法執行完畢後,對應的幀棧就從虛擬機器棧中出棧。

      (3)從上述的過程中,不難分析方法呼叫對應一次壓棧和出棧的過程,這是有時間開銷的過程,所以說遞迴執行的程式碼時間效率往往是底下的。

      (4)每個方法對應的幀棧都需要消耗一定的記憶體空間,而虛擬機器棧的記憶體空間是有限的,當方法的呼叫層次過深的時候就會有stackOverFlow異常發生。

3.本地方法棧

本地方法棧的作用其實和虛擬機器棧的職能完全一致,虛擬機器棧是為java方法服務的記憶體區域,而本地方法棧是為native方法服務的區域,除此之外本地方法棧的和虛擬機器棧並無區分。

4.堆區(Heap)

堆區也是開發人員最常接觸的記憶體區域,java中的物件以及陣列都是存放在堆區中的,堆區的記憶體可以是物理上連續的記憶體空間,也可以是邏輯上聯絡的記憶體空間。是JVM所管理的最大的記憶體區域,容易發生記憶體洩漏和記憶體溢位,是垃圾回收演算法重點照顧的區域。下面看一下java中的物件是如何在堆區中儲存的。

             圖3 java中物件的記憶體佈局

從圖3中可以看出 java中的物件在記憶體中的儲存由三部分組合:

(1)物件頭,物件頭的第一部分儲存物件自身執行時所需要的資料入圖中所示,第二部分中的型別指標用來指示這個物件是哪個類的事例,假如物件是陣列型別的話,還需要儲存陣列的長度資訊。

(2)例項資料,例項資料是物件真正儲存的有效區域,物件中定義的各種型別的變數,無論是從父類繼承的還是子類定義的都是存放在這個部分。

(3)對齊填充,這部分並無實際的含義,假如物件的記憶體大小不是8位元組的整數倍,就填充資料,使物件的記憶體資料大小是8位元組的整數倍。

5.方法區

方法區同樣也是開發人員常見用的記憶體區域,比如靜態變數,常量以及虛擬載入的類資訊都是存放在方法區中的。

java物件的建立和訪問的過程

      上節中,介紹了JVM的記憶體的分割槽以及各個區域的作用,有了上述的基本知識之後,我們通過物件的建立和訪問的過程,來直觀的感受jvm各個記憶體的分工。

      一丶物件建立過程

 

                   圖 1 java中物件建立的一般過程

二丶物件定位過程

1.基於控制代碼的物件定位

              圖 2 java中基於控制代碼的物件訪問方式

2.基於直接地址的物件定位

              圖3 java中基於直接地址的物件定位

Reference:[1]周志明 深入理解java虛擬機器-JVM高階特性與最佳實踐[M],機械工業出版社.

相關推薦

讀書筆記初見JVM記憶體區域

 初見JVM記憶體區域       JVM一個重要的機制就是自動記憶體管理機制,為了深入理解JVM的記憶體管理機制,瞭解JVM的記憶體的分割槽以及各個分割槽的作用是基礎,本文主要總結java虛擬機器的記憶體區域分類以及各個記憶體區域的作用。   java記憶體的分割槽及其作

《深入理解Java虛擬機器》讀書筆記4-執行時記憶體區域

Java執行時資料區域     Java執行時資料區域如下圖所示:             l  程式計數器:較小的記憶體空間,當前程式所執行的位元組碼的行號指示器。如果執行一個java方法,計數器記錄正在執行的虛擬機器位元組碼指令地址;如果

JVM讀書筆記垃圾收集與記憶體分配

1 概述   說起垃圾收集( Garbage Collection , GC ) ,大部分人都把這項技術當做 Java 語言的伴生產物。事實上, GC 的歷史遠遠比 Java 久遠,1960 年誕生於 MIT 的 Lisp 是第一門真正使用記憶體動態分配和垃圾收集技術的語言。當 Lisp 還在胚胎時期時,人們

深入理解JVMJVM記憶體區域記憶體分配

部落格出處: http://www.cnblogs.com/hellocsl/p/3969768.html?utm_source=tuicool&utm_medium=referral 先來看看JVM執行時候的記憶體區域   大多數 JVM 將記憶體區域劃分為

Objective-C高階程式設計讀書筆記記憶體管理

Objective-C高階程式設計 iOS與OS X多執行緒和記憶體管理 自動引用計數(ARC, Automatic Reference Counting) 目錄 什麼是自動引用計數 記憶體管理的思考方式 autorelease 所有權修飾符介紹 ARC規則 ARC實

JVM讀書筆記效能監控與故障處理工具

            Jhat搭配Jmap命令使用,用於分析jmap生成的堆儲存快照。jhat內建了一個微型的HTTP/HTML伺服器,生成dump檔案與分析結果後,可以在瀏覽器中檢視。一般不會使用jhat分析dump檔案,原因如下:1.分析耗時而且消耗硬體資源;2.jhat分析功能比較簡陋,不如Visua

讀書筆記面向對象的程序設計-1理解對象

-i chrom conf 理解 cnblogs object ftw 不能 pro ECMA-262把對象定義為:“無序屬性的集合,其屬性可以包含基本值、對象或者函數。” 創建自定義對象的最簡單方式就是創建一個Object的實例 eg:先創建一個名為person的對象,

《大型網站技術架構》讀書筆記六:永無止境網站的伸縮性架構

映射 應對 方法 訂閱 知識 位置 n+1 轉換 bsp 此篇已收錄至《大型網站技術架構》讀書筆記系列目錄貼,點擊訪問該目錄可獲取更多內容。 首先,所謂網站的伸縮性,指不需要改變網站的軟硬件設計,僅僅通過改變部署的服務器數量就可以擴大或者縮小網站的服務處理能力。在整個互聯

《C#圖解教程》讀書筆記四:類和繼承

intern html pan 類中訪問 ted obj 小寫 his new 本篇已收錄至《C#圖解教程》讀書筆記目錄貼,點擊訪問該目錄可獲取更多內容。 一、萬物之宗:Object   (1)除了特殊的Object類,其他所有類都是派生類,即使他們沒有顯示基類定義。   

《Pro Android Graphics》讀書筆記第二節

media data- sta power dev supported tin dsm ins Android Digital Video: Formats, Concepts and Optimization Android Digital Video Fo

《UNIX環境高級編程》讀書筆記系統數據文件和信息(1)

返回 -m 獲取 高級編程 記得 clas oid data- size 1.UNIX系統口令文件包括了下圖所看到的的各字段,這些字段包括在<pwd.h>中定義的passwd結構體中 POSIX定義了兩個獲取口令文件項的函數。在給出用戶登錄名或用戶ID後

讀書筆記-深入理解JVM虛擬機-1.OOM初探

-a 最大 xms stat new 理解 虛擬機 class 當前 Java堆OOM(Out-Of-Memory)異常 執行例如以下程序,爆出異常 java.lang.OutOfMemoryError: Java heap space /** * VM Ar

深入理解Java虛擬機讀書筆記---運行時數據區域

強制 申請 異常 模型 分配內存 類信息 gist 運行時 過程 運行時數據區域 1.程序計數器 程序計數器(Program Counter Register)是一塊較小的內存空間,它可以看作是當前線程所執行的字節碼的行號指示器。字節碼解釋器工作時就是通過改變這

讀書筆記宿舍共享wifi

spa 虛擬 com es2017 p s 找到 界面 span color 一、簡單安裝虛擬機(在虛擬機中開熱點,主機只能檢測到虛擬機這個軟件在使用流量而已) 安裝虛擬機挺簡單的,不懂的同學可以關註公眾號,菜單有具體安裝教程。(大神可以略過這裏) 二、簡單設置

《需求工程-軟件建模與分析讀書筆記六》

想要 gpo 窗口 業務規則 dbm 恢復 dem 數據庫管理系統 困難 設計良好的程序要最大化類的內聚同時要最小化類的耦合;遵循Demeter法則就是在類方法內用於指向對象的消息,那麽耦合和內聚的原理就可以實現;存取程序方法的過度使用會產生不用思考的類;混合實例的內聚

讀書筆記《操作系統概念》

dea 非共享 body any ber 編程 進程 分享 系統 非常小型的操作系統,如篇首的小恐龍所使用的驅動手持設備的操作系統,是Silberschatz、Galvin和Gagne第七版《操作系統概念》中的一種前沿應用。通過保留最新的,保持有意義的,並改編為課程最需要的

linux高性能網絡編程讀書筆記socket

strong 讀書筆記 後者 應用程序 發送數據 性能 傳輸層協議 實現 應用 ####socket背景:數據鏈路層、網絡層、傳輸層協議都是在內核中實現的。用途:socket和XTI(後者已經不怎麽使用)功能:1.將應用層數據從用戶緩沖區復制到TCP/UDP內核發送緩沖區,

linux 高性能讀書筆記應用層協議HTTP相關小知識

原理 連接 設置代理 客戶 代理服務 lin 不同 火墻 筆記 ####HTTP連襟:傳輸層協議默認使用TCP小知識:1.正向服務器要求客戶端自己設置代理服務器的地址。客戶端每次的請求都將直接發送到該代理服務器,並且由代理服務器來請求目標資源(常用於防火墻內的局域網機器要訪

linux 高性能讀書筆記小工具tcpdump

描述 由器 求和 數據 代理服務器 eth 我們 dns服務 應該 用途:抓取傳輸數據包 小技巧:在執行wget命令前,我們應該先刪除ARP高速緩存中路由器對應的項,這樣就可以觀察到TCP/IP通信過程中ARP協議如何起作用。 ARP:地址解碼 使用示例: arp -d 1

linux 高性能讀書筆記通用socket地址

結構體 ip地址轉換 win mil sock size 地域 int bit ####socket網絡編程接口socket的地址是結構體sockaddr代碼如下struct sockaddr{sa_family_t sa_family;char sa_data[14];