1. 程式人生 > >JVM記憶體區域--堆疊方法區等概念理解

JVM記憶體區域--堆疊方法區等概念理解

首先,我們來了解一下jvm的作用,JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。首先有一點需要糾正的是,java虛擬機器並非只能用於java語言的執行,他們的共識是將檔案編譯成.class檔案進行執行,jvm分為很多種,比較主流的jvm有oracle公司收購而來的HotSpot和IBM公司的J9 VM,值得一提的是HotSpot當初是為了執行strongerTalk語言而開發的,隨著oracle收購了HotSpot開發團隊,HotSpot開始與oracle收購sun公司得來的java進行結合,形成了經久不衰的hotspot jvm虛擬機器。

java記憶體的組成可以由Heap和NO-Heap組成,但是更加準確一點的解釋卻是分為執行緒記憶體和共享記憶體,共享記憶體在維基百科上的解釋是:

   在軟體中,術語共享記憶體指可被多個程序存取的記憶體,一個程序是一段程式的單個執行例項。在這種情況下,共享記憶體被用作程序間的通訊。

共享記憶體有一個最大的特點是它是隨著JVM的開啟而產生,在JVM結束時而消失的,生命週期和jvm一致

java執行時記憶體可分為以下五種:


如圖所示:jvm執行時資料區可分為執行緒私有記憶體和共享記憶體,執行緒私有記憶體分為java虛擬機器棧、本地方法棧、程式計數器,

而jvm共享記憶體可分為java堆和方法區,下面我們將進入今天的主題,為大家一一講解一下關於這幾種記憶體的特點以及怎樣

快速的區分這幾種記憶體:

       首先,看一遍就能直接記下來的當然就是我們的程式計數器了,首先我們先寫一個java檔案Test.java,然後在我們的

命令列中對Test.java編譯(即命令為javac Test.java),然後檢視編譯後的.class的檔案(即命令為javap -verbose Test),


             圖一


                           圖二

此時這就是我們的程式計數器在jvm工作時指向的行號,沒錯,程式計數器在這裡的理解就是jvm執行

過程中程式行號的記錄,其儲存的是java檔案的行號,當程式執行到第一行的時候程式計數器儲存的是

行號為0,此時儲存進去的行號為0,現在很多java虛擬機器會將本地方法棧和java虛擬機器棧進行合併實現,

像我們主流的HotSpot就是這樣子實現的,java棧幀在執行過程中可能丟擲的異常有OutOfMemoryError

和StackOverFlow異常,棧的一個最主要的特點是後進先出,java虛擬機器棧可分為,區域性變量表和運算元

棧兩種,區域性變量表是由若干個Slot(槽)組成的,組成結構類似我們的redis,單個槽可以儲存boolean、byte、

char、int、short等資料型別,像double和float等資料類似我們則使用兩個slot進行儲存,如圖二所示,

區域性變量表用於儲存jvm執行時變數如1000,2,3等資料,而操作棧的棧頂是儲存資料在執行資料相加和相乘時的

資料,資料從1000執行第一條相加指令完成後變為2000,然後進行第二條指令完成之後變成3006,並將棧頂資料

即運算結果進行輸出。

       下面,我們來講解一下我們的方法區和java堆,我們在進行例項化一個物件時如:Object obj = new Object();
此時,的Obect()是儲存於java虛擬機器堆裡面的,而obj是在java虛擬機器棧裡面的,java棧裡面的本地變量表會預存一個

slot用於儲存reference型別資料,通過一個reference我們至少可以查詢到java物件的例項資料和型別資料,

java虛擬機器中最大的一塊記憶體區域

是java堆,JVMS明確要求該區域需要實現自動記憶體管理,即常見的GC,java堆的記憶體分為JMS和JMX,即java堆最小

堆記憶體和最大堆記憶體,java堆可以分為新生代,年老代和永久帶,這種分發是基於java記憶體的經典演算法和記憶體演算法進行

劃分的,java堆記憶體超出時會丟擲OutOfMemoryError異常。方法區用於儲存Java類的結構資訊,

類的例項資訊用於儲存java類的例項變數以及例項變數的值,而類的類資訊指的是java類的常量,

靜態變數,以及在java中宣告的各種方法,以及編譯器編譯產生的class檔案。

相關推薦

JVM記憶體區域--堆疊方法概念理解

首先,我們來了解一下jvm的作用,JVM是Java Virtual Machine(Java虛擬機器)的縮寫,JVM是一種用於計算裝置的規範,它是一個虛構出來的計算機,是通過在實際的計算機上模擬模擬各種計算機功能來實現的。首先有一點需要糾正的是,java虛擬機器並非只能用於j

JVM 記憶體模型:方法(Method Area)

1. 前言 最近在研究Java語言底層基礎知識,發現對於JVM 記憶體模型理解不夠深入。筆者突發奇想深入理解JVM記憶體模型,特在此介紹詳細介紹一下JVM記憶體模型中的方法區。看似名稱叫做方法區,其實不然。它存放了一些類載入基本資訊、常量、靜態變數以及編譯後的程式碼等資料。下面我們來詳細

Java學習筆記--記憶體劃分 堆疊方法

淺理解: 假如你寫了一段程式碼:Object o=new Object();運行了起來!首先JVM會啟動,你的程式碼會編譯成一個.class檔案,然後被類載入器載入進jvm的記憶體中,你的類Object載入到方法區中,建立了Object類的class

JVM記憶體模型之方法

方法區 又稱非堆區(Non-Heap) 屬於 執行緒共有 內容 主要用來存放已被虛擬機器載入的類資訊、常量、靜態變數、即時編譯器編譯後的程式碼等資料。JDK8之前又被稱為永久帶 (Perman

Java記憶體區域——堆,棧,方法

執行時資料區域 jdk1.7中, Java虛擬機器在執行Java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。 程式計數器 1. 程式計數器(Program Counter Register)是一塊較小的記憶體空間,它

jvm記憶體區域----執行緒共享

一、堆的含義     jvm堆的區域主要是用來存放物件的例項,它的空間大小是JVM記憶體區域中佔比重最大的,也是jvm最大的記憶體管理模組,最重要的是,這個區域是垃圾收集器主要管理的區域,這意味著我們在考慮垃圾回收優化的時候,首先就要想到堆中的區域。 二、方法區   &nb

求你了,再問你Java記憶體模型的時候別再給我講堆疊方法了…

GitHub 4.1k Star 的Java工程師成神之路 ,不來了解一下嗎? GitHub 4.1k Star 的Java工程師成神之路 ,真的不來了解一下嗎? GitHub 4.1k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎? 最近,面試過很多Java中高階開發,問過很多次關於Java

磁盤結構中 簇、塊、扇概念

磁頭 itl htm happy 磁道 操作 window 是什麽 inux 柱面(cylinder) 磁頭(head) 圓盤(platter) 扇面 磁道(track) 扇區(sector) 簇、塊 扇區是磁盤最小的物理存儲單元,但由於操作系統無法對數目眾多的扇區進行

JVM記憶體區域引數配置

轉自:https://www.jianshu.com/p/5946c0a414b5 需要提前瞭解的知識點: JVM記憶體模型 JVM垃圾回收演算法 下圖是JVM記憶體區域劃分的邏輯圖  

JVM記憶體區域(一)—— 理論模型

引言 JVM在Java程式設計中起到了至關重要的作用,他遮蔽了底層細節,這樣只要有對應平臺的JVM版本,便可以執行自己的Java程式,從而實現了“一處編譯,到處執行”的特點。同時JVM的記憶體管理機制避免了類C語言中的delete/free操作,不容易出現記憶體洩漏和記憶體

為什麼JVM記憶體區域分為執行緒共享和非執行緒共享

大多數 JVM 將記憶體區域劃分為 Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程式計數器) , VM Stack(虛擬機器棧,也有翻譯成JAVA 方法棧的),Native M

JVM記憶體區域劃分Eden Space,Survivor Space,Tenured Gen,Perm Gen

  jvm區域總體分兩類,heap區和非heap區。heap區又分:Eden Space(伊甸園)、Survivor Space(倖存者區)、Tenured Gen(老年代-養老區)。 非heap區又分:Code Cache(程式碼快取區)、Perm Gen(永久代)、Jvm Stack(java虛擬機器棧)

JVM記憶體區域劃分及垃圾回收

   第一部分、閒扯+概述         近來在研讀《深入理解java虛擬機器》一書,讀完之後做個小結,算是記錄一下自己的學習所得,在成長的路上,只能死磕。 要理解JVM,就要先從其記憶體區域劃分開始,知道其由幾部分構成,再瞭解各部分的功能,這

JVM-記憶體區域

Java程式執行流程: 談一談Java記憶體區域的劃分實際上是指JVM記憶體區域的劃分,首先Java先介紹一下Java程式具體執行的過程 如上圖所示,首先Java原始碼們(.java字尾)會被Java編譯器編譯為位元組碼檔案(.class字尾),然後由JVM中的類載入器載入各個類的位元組碼檔案,

Java記憶體區域——本地方法

本地方法棧和虛擬機器棧是非常相似的,當然,它們之間也是有不同點的,其中就說,虛擬機器棧是為虛擬機器執行Java方法服務的,所謂的本地方法棧是為虛擬機器執行Native方法服務,說白了,它們的區別也就這一點。其他的,像棧大小的問題,記憶體溢位的問題,包括棧幀、區域性變量表等它們

jvm記憶體區域劃分,heap,Eden Space,Survivor Space,Survivor Space,Code Cache,Perm Gen

 jvm區域總體分兩類,heap區和非heap區。heap區又分:Eden Space(伊甸園)、Survivor Space(倖存者區)、Tenured Gen(老年代-養老區)。 非heap區又分:Code Cache(程式碼快取區)、Perm Gen(永久代)、Jvm Stack(

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

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

JVM記憶體區域詳解

JVM記憶體模型總體架構圖 程式計數器 多執行緒時,當執行緒數超過CPU數量或CPU核心數量,執行緒之間就要根據時間片輪詢搶奪CPU時間資源。因此每個執行緒有要有一個獨立的程式計數器,記錄下一條要執行的指令。執行緒私有的記憶體區域。如果執行的是JAVA方法,計數器

JVM記憶體區域詳解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)

JVM區域總體分兩類,heap區和非heap區。 heap區又分為: Eden Space(伊甸園)、 Survivor Space(倖存者區)、 Old Gen(老年代)。 非heap區又分: Code Cache(程式碼快取區); Perm Gen(永

JVM記憶體區域劃分(JDK6 7 8中的變化)

在Java7之前,HotSpot虛擬機器中將GC分代收集擴充套件到了方法區,使用永久代來實現了方法區。這個區域的記憶體回收目標主要是針對常量池的回收和對型別的解除安裝。但是在之後的HotSpot