1. 程式人生 > >jvm記憶體模型《深入理解java虛擬機器》

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

  最近學習了周志明老師的《深入理解Java虛擬機器》,收穫頗多,留下一些學習筆記,供以後複習用。

  JVM定義了若干個程式執行期間使用的資料區域。這個區域裡的一些資料在JVM啟動的時候建立,在JVM退出的時候銷燬。而其他的資料依賴於每一個執行緒,線上程建立時建立,線上程退出時銷燬。

一.重點筆記

執行緒共享區域:java堆  方法區。

執行緒私有區域:jvm棧  本地方法棧  程式計數器

二.各個區域作用:

java堆

  java堆是jvm記憶體管理中最大的一塊,執行緒共享。堆是垃圾收集器管理的主要區域,因此很多時候也被稱做“GC 堆”。在jvm啟動的時候建立。此區域唯一目的就是存放物件例項,幾乎所有的物件例項都在這裡分配記憶體。java堆細分為新生代和老年代,新生代又分為Eden空間、From Survivor空間、To Survivor空間,其大小在HotSpot虛擬機器中預設比例為8:1:1,新生代中垃圾回收演算法為複製演算法,老年代中採用的GC演算法為標記-清除演算法或者標記-整理演算法(GC演算法會在下一篇文章中具體講解)。在進行垃圾回收的時候新生代GC又叫minor GC,老年代GC可以設定記憶體容量達到百分比的多少的時候進行GC,老年代的GC又叫Full GC或者Major GC,minor GC時間短,頻率高,而Full GC時間長,頻率低。

方法區

  很多人都更加願意把方法區成為“永久代”,在jdk8中已經將永久帶移除了,用新出現的元空間(Metaspace)來代替原來的永久帶,執行緒共享,是用來儲存已被JVM載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。簡單說方法區用來儲存型別的元資料資訊,一個.class檔案是類被java虛擬機器使用之前的表現形式,一旦這個類要被使用,java虛擬機器就會對其進行載入、連線(驗證、準備、解析)和初始化。而載入後的最終產品位於堆或方法區的class物件,改物件封裝了一段特定的資料結構,供程式設計師提供訪問介面。這個區域很少進行垃圾回收,回收目標主要是針對常量池的回收和對型別的解除安裝。

  執行時常量池(Runtime Constant Pool):它是方法區的一部分。Class檔案中除了有類的版本、欄位、方法、介面等描述等資訊外,還有一項資訊是常量池(Constant Pool Table),用於存放編譯期生成的各種字面量和符號引用,這部分內容將在類載入後存放到常量池中。執行時常量是相對於常量來說的,它具備一個重要特徵是:動態性。當然,值相同的動態常量與我們通常說的常量只是來源不同,但是都是儲存在池內同一塊記憶體區域。Java語言並不要求常量一定只能在編譯期產生,執行期間也可能產生新的常量,這些常量被放在執行時常量池中。這裡所說的常量包括:基本型別包裝類(包裝類不管理浮點型,整形只會管理-128到127)和String(也可以通過String.intern()方法可以強制將String放入常量池)。

jvm棧

  執行緒私有,它的生命週期與執行緒相同。虛擬機器棧描述的是Java 方法執行的記憶體模型:每個方法被執行的時候都會同時建立一個棧幀(Stack Frame)用於儲存區域性變量表、操作棧、動態連結、方法出口等資訊。每個方法從呼叫直至執行完成的過程,就對應著一個棧幀在虛擬機器棧中入棧到出棧的過程。

  區域性變量表:一組變數值儲存空間,用於存放方法引數和方法內部定義的區域性變數。在Java程式被編譯成Class檔案時,就在方法的Code屬性的max_locals資料項中確定了該方法所需要分配的最大區域性變量表的容量。區域性變量表的容量以變數槽(Slot)為最小單位,32位虛擬機器中一個Slot可以存放一個32位以內的資料型別(boolean、byte、char、short、int、float、reference和returnAddress八種)。

  運算元棧:和區域性變數區一樣,運算元棧也是被組織成一個以字長為單位的陣列。但是和前者不同的是,它不是通過索引來訪問,而是通過標準的棧操作——壓棧和出棧—來訪問的。虛擬機器把運算元棧作為它的工作區——大多數指令都要從這裡彈出資料,執行運算,然後把結果壓回運算元棧。

  動態連線:虛擬機器執行的時候,執行時常量池會儲存大量的符號引用,這些符號引用可以看成是每個方法的間接引用。如果代表棧幀A的方法想呼叫代表棧幀B的方法,那麼這個虛擬機器的方法呼叫指令就會以B方法的符號引用作為引數,但是因為符號引用並不是直接指向代表B方法的記憶體位置,所以在呼叫之前還必須要將符號引用轉換為直接引用,然後通過直接引用才可以訪問到真正的方法。如果符號引用是在類載入階段或者第一次使用的時候轉化為直接應用,那麼這種轉換成為靜態解析,如果是在執行期間轉換為直接引用,那麼這種轉換就成為動態連線。

本地方法棧

  本地方法棧和JVM棧非常相似,它們之間的區別不過是jvm棧是為執行java方法服務,而本地方法棧是為jvm使用到對的本地方法服務。HotSpot虛擬機器中直接把本地方法棧和JVM棧合二為一了。

程式計數器

  程式計數器是一塊較小的記憶體空間,執行緒私有。它可以看作是當前執行緒所執行的位元組碼的行號指示器。在jvm的概念模型裡,位元組碼直譯器工作就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、跳轉、異常處理、執行緒恢復等基礎功能都需要依賴這個計數器來完成。

三.總結:

參考資料:

https://www.cnblogs.com/lifescolor/p/5481588.html
https://blog.csdn.net/u012152619/article/details/46968883

相關推薦

深入理解JAVA虛擬機器學習筆記(一)JVM記憶體模型

一、JVM記憶體模型概述 JVM記憶體模型其實也挺簡單的,這裡先提2個知識點: 1、組成:java堆,java棧(即虛擬機器棧),本地方法棧,方法區和程式計數器。 2、是否共享:其中方法區和堆區是執行緒共享的,虛擬機器棧,本地方法棧和程式計數器是執行緒私有的,也稱執行緒

視訊:深入理解Java虛擬機器jvm效能調優+記憶體模型+虛擬機器原理)共110集

龍果學院深入理解Java虛擬機器(Jvm效能調優+記憶體模型+虛擬機器原視訊 Java虛擬機器視訊教程一套不錯的視訊,課程一共有110課,課程目錄較多隻展示部分出來,喜歡的朋友下載看下 課程目錄(課程較多,只展示部分目錄) 課程大綱 第1節說在前面的話 [免費觀看]

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

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

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

  最近學習了周志明老師的《深入理解Java虛擬機器》,收穫頗多,留下一些學習筆記,供以後複習用。   JVM定義了若干個程式執行期間使用的資料區域。這個區域裡的一些資料在JVM啟動的時候建立,在JVM退出的時候銷燬。而其他的資料依賴於每一個執行緒,線上程

深入理解Java虛擬機器jvm記憶體模型以及各個分割槽】

1. JVM 記憶體模型 Java虛擬機器記憶體的各個區域包括: 程式計數器 Java虛擬機器棧 本地方法棧 Java堆 方法區 2. 程式計數器 什麼是程式計數器呢? 程式

深入理解Java虛擬機器JVM高階特性與最佳實踐閱讀總結—— 第十二章 Java記憶體模型與執行緒

Java記憶體模型JMM,主要目標是定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體讀取變數的底層細節,這裡的變數不包括執行緒私有的變數,如區域性引數;記憶體模型規定所有變數儲存在主記憶體;每個執行緒都有自己的工作記憶體,其中儲存了該執行緒用到的變數

學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_OOM(記憶體溢位)_虛擬機器引數設定_MAT

eclipse中設定debug標籤頁的vm引數 1,Run->Debug configurations->Java Application 2,選中已經寫好的專案 3,Arguments->VM arguments 4,在VM arguments 裡面就可以對虛擬機器的

學習筆記1:深入理解Java虛擬機器——JVM高階特性與最佳實踐_走進java_java記憶體區域與記憶體溢位異常

第一部分:走進java Java虛擬機器 程式碼在華章下載 jdk釋出了六個命令列工具和兩個視覺化故障處理工具。 推薦書籍 設計原本 領域特定語言 現在著名的Java虛擬機器 hotspot vm(預設) jrockit vm j9 vm jdk sun jdk op

深入理解Java虛擬機器JVM高階特性與實踐 周志明 著》之第2章 Java記憶體區域與記憶體溢位異常

1、Java虛擬機器所管理的記憶體包括以下幾個執行時資料區域: 2、程式計數器:          1. 可以看作是當前執行緒所執行的位元組碼的行號指示器,是一塊較小的記憶體空間;  &nbs

深入理解Java虛擬機器筆記——Java記憶體模型與併發程式設計

  當程式在執行過程中,會將運算需要的資料從主存複製一份到CPU的快取記憶體中,那麼CPU進行計算時就可以直接從它的快取記憶體讀取資料和向其中寫入資料,當運算結束後,再將告訴快取中的資料重新整理到主存中。   如果一個變數在多個CPU中都存在快取,那麼就存在快取一致性

Java記憶體模型與執行緒 深入理解Java虛擬機器總結

在許多情況下,讓計算機同時去做幾件事情,不僅是因為計算機的運算能力強大了,還有一個很重要的原因是計算機的運算速度與它的儲存和通訊子系統速度的差距太大, 大量的時間都花費在磁碟I/O、網路通訊或者資料庫訪問上。 如果不希望處理器在大部分時間裡都處於等待其他資源的狀態,就必須使用一些手段去把處理器

深入理解Java虛擬機器(5)Java記憶體模型

深入理解Java虛擬機器(5)Java記憶體模型 Java記憶體模型 主記憶體和工作記憶體 volatile關鍵字 long與double型別的特殊規則 synchronized關鍵字 Java記憶體模

讀書筆記 ---- 《深入理解Java虛擬機器》---- 第11篇:Java記憶體模型與執行緒

上一篇:晚期(執行期)優化:https://blog.csdn.net/pcwl1206/article/details/84642835 目  錄: 1  概述 2  Java記憶體模型 2.1  主記憶體與工作記憶體 2.2 

深入理解JAVA虛擬機器2:JVM記憶體結構

記憶體結構一覽 在上一篇文章中,我們最後給出了一幅圖 這幅圖中,就包含了JVM的記憶體結構的所有組成元素,他們分別是:java堆記憶體、java棧、方法區、本地方法區以及pc暫存器,接下來我們就對這些區域逐一介紹。 java堆       Java堆是Java虛擬

深入理解 Java 虛擬機器(十二)Java 記憶體模型與執行緒

執行緒安全 Java 語言中的執行緒安全 根據執行緒安全的強度排序,Java 語言中各種操作共享的資料可以分為 5 類:不可變、絕對執行緒安全、相對執行緒安全、執行緒相容、執行緒對立。 不可變 不可變的物件一定是執行緒安全的,如果共享資料是一個基本資料型別,那麼

深入理解Java虛擬機器(七)之Java記憶體模型

深入理解Java虛擬機器系列文章 Java記憶體模型規定了所有的變數都儲存在主記憶體,每個執行緒都有自己的工作記憶體,執行緒中的工作記憶體儲存了被該執行緒使用到的變數的主記憶體的副本拷貝。執行緒對變

JVM垃圾收集器與記憶體分配策略(總結自《深入理解Java虛擬機器》)

1、物件可用性判斷 垃圾收集器在回收物件前,需要判斷哪些物件沒有被廢棄,哪些物件已經廢棄了(即無法通過任何途徑使用的物件)。所以,垃圾收集器需要一種演算法來判定這個物件是否需要回收。 (1)引用計數演算法 引用計數演算法的基本思想是給一個物件新增一個引用計數器,

深入理解Java虛擬機器(二) --- JVM記憶體管理

執行時的資料區域 一.程式計數器 目的:作為當前執行緒所執行位元組碼的行號指示器 原理:通過位元組碼直譯器改變計數器的值來選取下一條位元組碼指令 特點: 1.佔用較小的記憶體空間 ​ 2.每條執行緒需要一個獨立的程式計數器 ​ 3.

深入理解java虛擬機器】第0集--Java記憶體區域和java記憶體模型

首先我們清楚【記憶體區域】和【記憶體模型】是兩個不一樣的概念。當時我電面阿里的時候,面試官讓我講講記憶體模型的理解,我巴拉巴拉說了一通方法區-堆分割槽,垃圾演算法,面試官耐心的聽我說完就把電話掛了。 【記憶體區域】對應的是jvm程序。jvm啟動之後,自身是一個大的程序,作業

深入理解Java虛擬機器讀書筆記8----Java記憶體模型與執行緒

八 Java記憶體模型與執行緒   1 Java記憶體模型     ---主要目標:定義程式中各個變數的訪問規則,即在虛擬機器中將變數儲存到記憶體和從記憶體中取出變數這樣的底層細節。     ---此處的變數和Java中的變