1. 程式人生 > >JVM調優(一)虛擬機器的記憶體模型

JVM調優(一)虛擬機器的記憶體模型

前言

Java虛擬機器記憶體模型是Java程式執行的基礎,JVM虛擬機器的記憶體模型如下圖:

程式計數器

程式計數器(Program Counter Register)是一塊很小的記憶體空間。由於java是支援多執行緒的語言,當執行緒數超過cpu的數量時,執行緒之間根據時間片輪詢搶奪cpu資源。對於單核cpu而言,每一時刻只能有一個執行緒執行,而其他執行緒必須被切換出去。為此每一個執行緒必須用一個獨立的程式計數器,用於記錄下一條要執行的指令。各個執行緒的程式計數器,互不影響,獨立工作,是一塊程式私有的記憶體空間。


如果當前執行緒正在執行一個java方法,則程式計數器記錄正在執行的java位元組碼地址,如果當前執行緒正在執行一個native方法,則程式計數器為空。


java虛擬機器棧

java虛擬機器棧也是執行緒私有的記憶體空間,它和執行緒在同一時間建立,它儲存方法的區域性變數、部分結果,並參與方法的呼叫和返回。

java虛擬機器規範允許java棧的大小是動態的或者固定的,如果執行緒在計算的過程中,請求的棧深度大於最大可用的棧深度,則丟擲StackOverflowError;如果java棧可以動態擴充套件,在擴充套件的過程中,沒有足夠的記憶體空間來支援棧的擴充套件,則丟擲OutOfMemoryError。

在Hot Spot虛擬機器中,可以使用-Xss引數來設定棧的大小。棧的大小直接決定了函式呼叫的可達深度。

以下程式碼是一個遞迴呼叫,計數器記錄了遞迴的層次,這個沒有出口的遞迴程式一定會導致棧溢位。程式在棧溢位時,打印出棧的當前深度,

本地方法棧

java堆

 

 

方法區

與堆空間類似,它也是被jvm中所有執行緒共享的。方法區主要儲存的是類的元資料。

對常量池的回收:只要常量池中的常量沒有被任何地方引用,就可以被回收。

對類元資料的回收:如果虛擬機器確認該類的所有例項已經被回收,並且載入該類的classloader已經被回收,gc就有可能回收該型別。


--------------------- 
作者:程式碼最誠實的朋友 
來源:CSDN 
原文:https://blog.csdn.net/matt8/article/details/52274039 
版權宣告:本文為博主原創文章,轉載請附上博文連結!