1. 程式人生 > >JVM記憶體結構分析

JVM記憶體結構分析

對於Java程式設計師來說,記憶體是由JVM自動管理的,所以一旦出現記憶體洩漏或溢位的問題,不瞭解JVM的記憶體結構和各個記憶體區域的工作職責,將對解決問題帶來很大的麻煩,本文參照周志明的《深入理解Java虛擬機器》,介紹JVM的記憶體結構,比較枯燥,但對知其然,不知所以然的編碼人員來說還是有一定幫助的。

  按照Java虛擬機器規範的規定,JVM自動管理的記憶體將會包括以下幾個執行時資料區域。

   

  程式計數器

程式計數器(Program Counter Register)是JVM中一塊較小的記憶體區域,儲存著當前執行緒執行的虛擬機器位元組碼指令的記憶體地址。Java多執行緒的實現,其實是通過執行緒間的輪流切換並分配處理器執行時間的方式來實現的,在任何時刻,處理器都只會執行一個執行緒中的指令。在多執行緒場景下,為了保證執行緒切換回來後,還能恢復到原先狀態,找到原先執行的指令,所以每個執行緒都會設立一個程式計數器,並且各個執行緒之間不會互相影響,程式計數器為"執行緒私有"的記憶體區域。

  如果當前執行緒正在執行Java方法,則程式計數器儲存的是虛擬機器位元組碼的記憶體地址,如果正在執行的是Native方法(非Java方法,JVM底層有許多非Java編寫的函式實現),計數器則為空。程式計數器是唯一一個在Java規範中沒有規定任何OutOfMemory場景的區域。

  虛擬機器棧

  虛擬機器棧(Java Virtual Machine Stacks)和執行緒是緊密聯絡的,每建立一個執行緒時就會對應建立一個Java棧,所以Java棧也是"執行緒私有"的記憶體區域,這個棧中又會對應包含多個棧幀,每呼叫一個方法時就會往棧中建立並壓入一個棧幀,棧幀是用來儲存方法資料和部分過程結果的資料結構,每一個方法從呼叫到最終返回結果的過程,就對應一個棧幀從入棧到出棧的過程。

  虛擬機器棧是一個後入先出的資料結構,執行緒執行過程中,只有一個棧幀是處於活躍狀態的,被稱為"當前活動幀棧",當前活動幀棧始終是虛擬機器棧的棧頂元素。

  

  本地方法棧

本地方法棧(Native Method Stack)和虛擬機器棧的作用相似,不過虛擬機器棧是為Java方法服務的,而本地方法棧是為Native方法服務的。

  方法區

方法區(Method Area)是用於儲存類結構資訊的地方,包括常量池、靜態變數、建構函式等型別資訊,型別資訊是由類載入器在類載入時從類檔案中提取出來的。

  方法區同樣存在垃圾收集,因為使用者通過自定義載入器載入的一些類同樣會成為垃圾,JVM會回收一個未被引用類所佔的空間,以使方法區的空間達到最小。

  方法區中還存在著常量池,常量池包含著一些常量和符號引用(載入類的連線階段中的解析過程會將符號引用轉換為直接引用)。

  方法區是執行緒共享的。

  

  堆(heap)是儲存java例項或者物件的地方,是GC的主要區域,同樣是執行緒共享的記憶體區域。

  案例分析一

  

  案例分析二

  

      

   上面main方法中執行的程式過程如下:

  (1)使用者建立了一個Student物件,執行時JVM首先會去方法區尋找該物件的型別資訊,沒有則使用類載入器classloader將Student.class位元組碼檔案載入至記憶體中的方法區,並將Student類的型別資訊存放至方法區。

  (2)接著JVM在堆中為新的Student例項分配記憶體空間,這個例項持有著指向方法區的Student型別資訊的引用,引用指的是型別資訊在方法區中的記憶體地址。

  (3)在此執行的JVM程序中,會首先起一個執行緒跑該使用者程式,而建立執行緒的同時也建立了一個虛擬機器棧,虛擬機器棧用來跟蹤執行緒執行中的一系列方法呼叫的過程,每呼叫一個方法就會建立並往棧中壓入一個棧幀,棧幀用來儲存方法的引數,區域性變數和運算過程的臨時資料。上面程式中的stu是對Student的引用,就存放於棧中,並持有指向堆中Student例項的記憶體地址。

  (4)JVM根據stu引用持有的堆中物件的記憶體地址,定位到堆中的Student例項,由於堆中例項持有指向方法區的Student型別資訊的引用,從而獲得add()方法的位元組碼資訊,接著執行add()方法包含的指令。

   總結

  1、所有執行緒共享的記憶體資料區:方法區,堆。而虛擬機器棧,本地方法棧和程式計數器都是執行緒私有的。

   2、存放於棧中的東西如下:
      2.1 每個執行緒包含一個棧區,棧中只儲存基礎資料型別的物件和自定義物件的引用(不是物件)。物件都存放在堆區中。

    2.2 每個棧中的資料(基礎資料型別和物件引用)都是私有的,其他棧不能訪問。
      2.3 方法的形式引數,方法呼叫完後從棧空間回收
      2.4 引用物件的地址,引用完後,棧空間地址立即被回收,堆空間等待GC

   3、存放於堆中的東西如下:

    3.1 儲存的全部是物件,每個物件包含一個與之對應的class資訊

    3.2 Jvm只有一個堆區(heap)被所有執行緒共享,堆區中不存放基本型別和物件引用,只存放物件本身

4、存放於方法區中的東西如下:

    4.1 存放執行緒所執行的位元組碼指令

    4.2 跟堆一樣.被所有執行緒共享.方法區包含:所有的class和static變數

    4.3 常量池位於方法區中,見如下圖示說明

    

相關推薦

JVM記憶體結構分析

對於Java程式設計師來說,記憶體是由JVM自動管理的,所以一旦出現記憶體洩漏或溢位的問題,不瞭解JVM的記憶體結構和各個記憶體區域的工作職責,將對解決問題帶來很大的麻煩,本文參照周志明的《深入理解Java虛擬機器》,介紹JVM的記憶體結構,比較枯燥,但對知其然,不知所以然的

JVM記憶體結構分析

 JVM在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。這些區域都有各自的用途,以及建立和銷燬的時間,有的區域隨著虛擬機器程序的啟動而存在,有些區域則依賴使用者執行緒的啟動和結束而建立和銷燬。JVM所管理的記憶體主要包括程式計數器、Java虛擬機器棧、本地方法棧

JVM記憶體結構、Java記憶體模型以及Java物件模型之間的區別

Java作為一種面向物件的,跨平臺語言,其物件、記憶體等一直是比較難的知識點。而且很多概念的名稱看起來又那麼相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM記憶體結構、Java記憶體模型和Java物件模型,這就是三個截然不同的概念,但是很多人容易弄混。 可以這樣說,很多高階開發甚至都搞

jvm 記憶體結構初步理解

執行緒隔離區 1. 虛擬機器棧:當方法執行時 會建立虛擬棧幀 儲存區域性變量表運算元棧,動態連結和方法出口,而初學者說的’堆疊’指的是棧中棧幀的區域性變量表中的內容,會存放編譯期可知的所有的基本資料型別,和物件型別的引用; 2. 本地方法棧:作用與虛擬機器棧類似,但是是讀取本地方法的; 3.

JVM(一)JVM記憶體結構

Java程式碼需要執行在虛擬機器(JVM)上,而JVM為了方便管理記憶體,會把自己所管理的記憶體劃分為若干個不同的資料區域,用作不同的用途,先看一下大致劃分 堆 存放內容:     ·大多數建立的物件     ·陣列值 GC情況:

JVM記憶體結構?為什麼需要GC?

原 https://blog.csdn.net/tonytfjing/article/details/44278233 JVM結構、記憶體分配、垃圾回收演算法、垃圾收集器 1.方法區(Method Area) 2.堆區(Heap) 3.虛擬機器棧(VM Stack) 4.本地方法棧(

知識點整理1:JVM記憶體結構

  JVM把記憶體分為如下幾個區域: 1.方法區(Method Area) 2.堆區(Heap) 3.虛擬機器棧(VM Stack) 4.本地方法棧(Native Method Stack) 5.程式計數器(Program Counter R

JVM記憶體結構佈局

Java的記憶體結構 JVM記憶體結構主要有三大塊:堆記憶體、方法區和棧。 堆記憶體是JVM中最大的一塊由年輕代和老年代組成,而年輕代記憶體又被分成三部分,Eden空間、From Survivor空間、To Survivor空間,預設情況下年輕代按照8:1:1的比例

深入淺出JVMjvm記憶體結構,類載入器圖,雙親委託模式,堆記憶體,GC解析,GC演算法)

目錄 Java虛擬機器的記憶體結構:  類載入器圖: 雙親委託模式: 堆記憶體: GC解析圖: GC演算法 Java虛擬機器的記憶體結構:  類載入器圖:   雙親委託模式: Java允許建立和JDK自帶類

一、基礎篇(JVM記憶體結構

一.概念 JAVA的JVM的記憶體可分為3個區:堆(heap)、棧(stack)和方法區(method) 1)堆區: a.儲存的全部是物件,每個物件都包含一個與之對應的class的資訊。(class的目的是得到操作指令) b.jvm只有一個堆區(heap)被所有執行緒共享,堆中不存放

JVM-JVM記憶體結構

一、概念 Java虛擬機器——JVM,,JVM我們可以想象為一個DOS程式,java之所以能做到“一次編譯,處處執行”,就是因為它的存在。java程式從原始碼到執行三個階段:編碼--編譯--執行,其中jvm在其中的角色就是編譯階段,將.class檔案解釋為機器碼,也就是說,只要有了jvm,那麼不管

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

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

JVM記憶體結構詳解

主要內容如下: JVM啟動流程 JVM基本結構 記憶體模型 編譯和解釋執行的概念   一、JVM啟動流程: JVM啟動時,是由java命令/javaw命令來啟動的。 二、JVM基本結構: JVM基本結構圖: 《深入理解Ja

Jvm--01、Jvm記憶體結構

HotSpot VM,它是Sun JDK和OpenJDK中所帶的虛擬機器,也是目前使用範圍最廣的Java虛擬機器。 話不多說上圖、Jvm記憶體結構圖: 深入理解Java虛擬機器(第二版)如圖:     方法區和堆是執行緒共享的、所有會有執行緒安

JVM記憶體結構 VS Java記憶體模型 VS Java物件模型

Java作為一種面向物件的,跨平臺語言,其物件、記憶體等一直是比較難的知識點。而且很多概念的名稱看起來又那麼相似,很多人會傻傻分不清楚。比如本文我們要討論的JVM記憶體結構、Java記憶體模型和Java物件模型,這就是三個截然不同的概念,但是很多人容易弄混。 可以這樣說

Mybatis的原理與JVM記憶體結構(面試題)

Mybatis的原理 1.Mapper 介面在初始SQL SessionFactory註冊的 2.Mapper 介面註冊在名為MapperRegistry類的 HasMap中 key=Mapper class   value = 建立當前Mapper的工廠  3.

JVM記憶體結構(Java 工程師成神之路·基礎篇·JVM

第一章 JVM記憶體結構 第一章 JVM記憶體結構 為什麼要了解JVM記憶體管理機制 JVM自動的管理記憶體的分配與回收,這會在不知不覺中浪費很多記憶體,導致JVM花費很多時間去進行垃圾回收(GC) 記憶體洩露,導致JVM記憶體最終不夠用 JVM記憶體結構

JVM記憶體結構------堆,棧,方法區,以及堆和棧的區別

一 、 定義 堆:FIFO佇列優先,先進先出。JVM只有一個堆區被所有執行緒所共享!堆存放在耳機快取中,呼叫物件的速度相對慢一些,生命週期由JVM的垃圾回收機制定。 棧:FILO先進後出,暫存資料的地方。每個執行緒都包含一個棧區!棧存放在一級快取中,存取速度較快,“棧是限定

JVM記憶體結構--新生代及新生代裡的兩個Survivor區(下一輪S0與S1交換角色,如此迴圈往復)、常見調優引數

轉自http://www.cnblogs.com/duanxz/p/6076662.html 一、為什麼會有年輕代   我們先來屢屢,為什麼需要把堆分代?不分代不能完成他所做的事情麼?其實不分代完全可以,分代的唯一理由就是優化GC效能。你先想想,如果沒有分代,那我們

Java虛擬機器詳解----JVM記憶體結構

http://www.cnblogs.com/smyhvae/p/4748392.htm   主要內容如下: JVM啟動流程 JVM基本結構 記憶體模型 編譯和解釋執行的概念   一、JVM啟動流程: JVM啟動時,是由java命令/javaw命令來啟