最近學習了jvm虛擬機器的記憶體模型,開始學習時,我就像乙隻填鴨,書上寫什麼就接受什麼,學完了也只是理解了一到兩成的知識。所以我現在想帶著我的疑問去學習,首先為什麼我們需要學習jvm虛擬機器的記憶體模型?
記憶體顧名思義就是存放東西的,存放的是程式執行時的資料。那既然記憶體是存放東西的話,那我們就要清楚把資料怎麼去放到記憶體,用的時候怎麼從記憶體中拿回來。所以學習jvm虛擬機器的記憶體模型就是學習jvm怎麼去管理記憶體。
根據資料的特性,jvm把一大塊的記憶體劃分成幾個區域。
這裡我們需要解決幾個問題。
第一、這幾個區各自的存放哪些資料,
第二、怎麼放
第三、用的時候怎麼拿回
第四、資料長什麼樣
第五、為什麼要這樣劃分。
第六、實際中怎麼配置這幾個區域
程式計數器:每個執行緒都需要乙個程式計數器,是指示當前執行緒工作到了哪一條指令。
本地方法棧:存放的函式傳遞的引數,區域性變數,函式返回位址,指令操作的臨時資料。
虛擬機器方法棧:
堆:物件的例項實際存放的地方
方法區:類的元資料,class物件,靜態變數
常量池:定義在類中的常量,字串常量
不知道
乙個執行緒建立的時候,就會去申請乙個連續區域。方法呼叫時,會不斷的往棧頂去延伸。
建立乙個物件時,就會向jvm申請一塊記憶體,記憶體大小要足以放入資料。
指標碰撞演算法,指標向空閒的區域移動。
標記演算法,有個表記錄哪些記憶體沒被用,哪些沒被用。
-xms:初始堆大小
-xmn:堆年輕代的大小
-xmx:堆的最大限制
-xss:每個執行緒的棧大小
-xx:permsize 持久代大小
-xx:maxpermsize 持久代最大大小
未解決
##虛擬機器方法棧 深入理解Java虛擬機器
1.class檔案是一組以8位位元組為基礎單位的二進位製流,各個資料專案嚴格按照順序緊湊地排列在class檔案中,中間沒有新增任何分隔符,這使得整個class檔案中儲存的內容幾乎全部是程式執行的必要資料,沒有空隙存在。當遇上占用8位位元組以上的資料時,按照高位在前的方式分割成若干個8位進行儲存 大端...
深入理解Java虛擬機器 JVM記憶體洩漏
jvm記憶體洩漏 記憶體洩漏就是存在一些物件沒有被 這些物件是可達的,但是這些物件是無用的,那麼這些物件就存在記憶體洩漏,即不會被gc 但是卻占用記憶體。記憶體溢位主要分為以下幾種 1.靜態集合類引起記憶體洩漏 像hashmap vector等的使用最容易出現記憶體洩露,這些靜態變數的生命週期和應用...
深入理解jvm記憶體區域
jvm 執行記憶體的整體流程 jvm 向作業系統申請記憶體 jvm 獲得記憶體空間後,會根據配置引數分配堆 棧以及方法區的記憶體大小 xms30m xmx30m xss1m xx maxmetaspacesize 30m 類載入這裡主要是把 class 放入方法區 還有 class 中的靜態變數和常...