1. 程式人生 > >深入JVM(Java虛擬機器)(一)Java虛擬機器記憶體區域劃分

深入JVM(Java虛擬機器)(一)Java虛擬機器記憶體區域劃分

   本文為博主參閱自《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》,書中的全部講解均以《Java虛擬機器規範(Java SE 7)》為依據

  

圖一中為JVM規範中對java虛擬機器記憶體區域的劃分及定義,為單執行緒時的粗略劃分

圖二,中所繪為JVM在多執行緒情況下執行時的各區域間關係,

1、Java堆

在Java虛擬機器中,堆是可供各個執行緒共享的執行時記憶體區域,也是供所有類例項和陣列物件分配記憶體的區域。這塊區域隨著虛擬機器的啟動而建立,它的唯一使命就是存放物件例項,這塊區域也是GC主要關注的地方。可以細分為新生代、老年代和永久代,新生代裡面又可以分為Eden Space、From Survivor Space和To Survivor Space。
Java堆可以是固定的大小也可以是按照需求動態擴充套件的,而且不需要保證是連續的。

存放內容:所有的物件和陣列

2、方法區

方法區是一個執行緒共享的區域,它用於儲存已被虛擬機器載入的類資訊、常量、靜態變數。方法區是堆的邏輯組成部分,Hotspot用永久代實現了方法區。

方法區還包含執行時常量池,用於存放編譯時生成的各種字面量和符號引用,但是不要求常量一定是在編譯時期產生的,執行期間也可以將新的常量放入池中,比如String的intern()方法便是利用了這一特性。

存放內容:類的結構資訊,如類的欄位、方法、介面、建構函式,還有執行時常量池等。

3、執行時常量池

執行時常量池是方法區的一部分,用於存放在編譯期產生的字面量和符號引用,這部分內容將在類載入後進入方法區的常量池中存放,也可以在執行期將新的常量放到池中,例如String類中的intern()方法

4、程式計數器

這塊區域是每個執行緒獨立擁有的,也就是執行緒私有的,我們可以把它看作是當前執行緒所執行的位元組碼的行號指示器。

這塊區域時虛擬機器規範裡面唯一一個沒有規定任何OutOfMemoryError情況的區域。

存放內容:如果執行緒執行的是一個Java方法,那麼暫存器裡面記錄的就是正在執行的虛擬機器位元組碼指令的地址,如果執行緒執行的是一個native方法,那麼暫存器記錄的值為undefined。

5、虛擬機器棧

虛擬機器棧也是執行緒私有的記憶體區域。每個方法在執行的時候都會建立一個棧幀用於儲存區域性變量表、運算元棧、方法出口等資訊,每一個方法從呼叫到執行完成就是一個棧幀入棧和出棧的過程。

區域性變量表存放了編譯時期可知的各種基本資料型別、物件引用和指向了一條位元組碼指令的地址。

存放內容:區域性變量表、運算元棧、方法出口等資訊。

6、本地方法棧

和虛擬機器棧類似,本地方法棧為虛擬機器使用到的Native方法服務,有的虛擬機器中將本地方法棧與虛擬機器棧合二為一。

直接記憶體

直接記憶體(Direct Memory)並不是虛擬機器執行時資料區的一部分,也不是Java虛擬機器規範中定義的記憶體區域,但在Java1.4中新加入的NIO相關類中,會使用Native函式庫分配堆外記憶體,並使用堆中的DirectByteBuffer物件操作所申請的堆外記憶體,所以本文中將這部分拿出來,作為對詞彙的解釋,以便讀者在被提到這部分割槽域時,能有所瞭解。

相關推薦

深入理解Java虛擬機器--- JavaJVM

Java 特性 1.結構嚴謹,面向物件程式語言 2.跨平臺性 3.較安全的記憶體管理和訪問機制(避免了絕大部分記憶體洩漏和指標越界的問題) 4.實現熱點程式碼檢測和執行時編譯優化 5.擁有一套完整的API介面 6.擁有豐富的第三方庫 JVM 特性 基於棧

深入JVM(Java虛擬機器)Java虛擬機器記憶體區域劃分

   本文為博主參閱自《深入理解Java虛擬機器:JVM高階特性與最佳實踐(第2版)》,書中的全部講解均以《Java虛擬機器規範(Java SE 7)》為依據    圖一中為JVM規範中對java虛擬機器記憶體區域的劃分及定義,為單執行緒時的粗略劃分 圖二,中所繪為JVM

深入理解java虛擬機器java虛擬機器記憶體區域

一、 java虛擬機器記憶體區域主要有:方法區、堆、虛擬機器棧、本地方方法棧、程式計數器     按照執行緒私有和共有來分:執行緒私有的有--程式計數器,虛擬機器棧,本地方法棧。共有的有--本地方法區,堆     1、程式計數器:主要功能是控制程式

深入拆解虛擬機器Java程式碼是咋樣執行的

Java執行方式 序號 方式 1 開發工具中執行 2 雙擊Jar檔案執行 3 命令列中執行

深入理解java虛擬機器java記憶體區域

程式計數器:可以看作當前執行緒所執行的位元組碼的行號指示器,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條 需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來實現。每一個執行緒都有一個獨立的程式計數器,各個執行緒之間的計數器互不影響,獨立

Java程序員從笨鳥到菜鳥之九十二深入java虛擬——java虛擬機底層結構詳解

行為 計數 驗證 堆棧 第一個 精度 amp 語言 eight 本文來自:曹勝歡博客專欄。轉載請註明出處:http://blog.csdn.net/csh624366188 歡迎關註微信賬號:java那些事:csh624366188.每天一篇java相關的文

Java併發程式設計Java記憶體模型

目錄 一、原子性、可見性和有序性 二、JMM概念 三、指令重排 四、happens-before規則 一、原子性、可見性和有序性 提到併發程式設計就得搞清楚原子性、可見性、有序性這三大性質,搞不清這三個性質,後面的概念也就很模糊。 1、原子性 概念:一個操作或多個

Java學習記錄java開發環境配置 及第一個執行程式

一. 下載jdk檔案 選擇對應版本下載即可安裝(本文以windows 64位為例) 安裝目錄儘量放至同一空白目錄下 安裝成功! 二. jdk環境配置 1. 點選此電腦右鍵點選屬性 2. 點選高階系統設定

Java學習資料——Java書籍

[SEO實戰密碼:60天網站流量提高20倍].影印版.pdf [瘋狂JAVA講義].李剛.高清掃描版.pdf 《Java語言程式設計(一)》串講筆記(完整版).doc 【網易內部資料】深入淺出MySQL資料庫開發、優化與管理維護.pdf 21天學通Java_6.pdf 30天學通Java_Web專案案例開發

Java系列】Java圖形化介面設計——中間容器Jpanel

Swing 程式用JFrame 物件實現了它們的視窗。JFrame 類是AWT Frame 類的一個子類。它還加入了一些Swing 所獨有的特性。與 Frame 的使用十分相似。唯一的區別在於,你不能將元件加入到JFrame中。你可以或者將元件加入到JFrame 的co

JAVA學習記錄————JAVA中的集合類

數組 節點 唯一性 list 接口規範 hashcode 工具類 collect 上進 這個圖是總體的框架圖,主要是兩個接口Collection和Map都繼承接口Iterator(Iterable),為了實現可以使用叠代器。Collection和Map類似平級關系。

深入理解Java虛擬機器——JVM整體結構與垃圾回收演算法介紹

JVM整體架構 •JVM(虛擬機器):指以軟體的方式模擬具有完整硬體系統功能、執行在一個完全隔離環境中的完整計算機系統 ,是物理機的軟體實現。常用的虛擬機器有VMWare,Virtual Box,Ja

深入理解java虛擬機器----jvm記憶體模型

最近大致的學習了一下jvm的相關技術,發現深入理解java虛擬機器這本書很不錯,所以想將這本書的內容的重難點在blog總結一下,一是為了鞏固這些知識,二是為了把這些重點單獨寫出來,讓初學者在學習的時候有一個大致的框架以至於學起來不至於那麼迷茫 學習java虛擬

深入理解JVM虛擬機:Java運行時數據區域

字面量 符號 地方 64位 因此 lower 優化 java堆大小 工作 概述 JVM是Java語言的精髓所在,因為它Java語言實現了跨平臺運行,以及自動內存管理機制等,本文將從概念上介紹JVM內存的各個區域,說明個區域的作用。 JVM運行時數據區模型 Java虛擬機在執

讀書筆記《深入理解Java虛擬機器JAVA記憶體區域

  .結構圖來自原書 執行緒私有區域 程式計數器 虛擬機器棧 本地方法棧 所有執行緒共享 方法區 堆   程式計數器(執行緒私有) 是一塊較小的記憶體空間,可以看做是當前執行緒所執行的位元組碼的行號

深入理解java虛擬機器

前言  本篇主要講述java記憶體區域的劃分。下面直接進入正題。 概述 java虛擬機器就是在真實物理機上虛擬出來的一臺計算機,java語言有一個特點就是可以跨平臺,其中java起著關鍵作用。這是因為它遮蔽與平臺相關的資訊,java原始檔經過編譯程式編譯後生成位元組碼檔

深入理解java虛擬機器閱讀筆記java記憶體區域

1.1  概述 對於java來說,虛擬機器是採用的自動管理記憶體機制,不需要手動去寫delete/free程式碼,但是常在河邊走哪有不溼鞋,程式不可避免會遇到記憶體溢位或洩漏的問題,因此知道記憶體區域分佈情況對於記憶體管理是很有必要的。 1.2  執行時資料區域 java虛擬機器在執

深入理解java虛擬機器java記憶體區域記憶體結構劃分

圖一:java記憶體結構劃分 由上圖可知,java記憶體主要分為6部分,分別是程式計數器,虛擬機器棧,本地方法棧,堆,方法區和直接記憶體,下面將逐一詳細描述。 1、程式計數器 執行緒私有,即每個執行緒都會有一個,執行緒之間互不影響,獨立儲存。 代表著當前執行緒所執行

Java垃圾回收物件存活狀態判斷---深入理解Java虛擬機器

程式計數器,虛擬機器棧和本地方法棧 首先我們先來看下垃圾回收中不會管理到的記憶體區域,在Java虛擬機器的執行時資料區我們可以看到,程式計數器,虛擬機器棧,本地方法棧這三個地方是比較特別的。這個三個部分的特點就是執行緒私有的,它們隨著執

Java虛擬JVM的運行機制

包括 MQ inf 分配 font 可能 mage star 都是 一、JVM啟動流程 1.java虛擬機啟動的命令是通過java +xxx(類名,這個類中要有main方法)或者javaw啟動的。 2.執行命令後,系統第一步做的就是裝載配置,會在當前路徑中尋找jvm的