JVM記憶體結構與GC

2022-09-12 09:39:15 字數 954 閱讀 3375

前段時間沒有好好準備,錯過了「金三銀四」,因此最近開始惡補各方面知識,決定先從jvm記憶體結構和gc開始。

jvm記憶體結構分為如下幾部分(前兩項為執行緒共享,後三項為執行緒私有的):

1、方法區:儲存已經被虛擬機器載入的類資訊、常量、jit(及時編譯器just in time)編譯後的**以及類變數(static修飾的變數)。

2、堆記憶體:jvm中最大的記憶體區域,j**a執行時建立的所有物件幾乎都存在於此,並且還是gc的重點照顧區域,除此之外還存0有例項變數。

4、本地方法棧:呼叫本地方法的介面(jni),網路通訊、檔案操作的底層。

5、程式計數器:存放當前執行緒接下來將要執行的位元組碼指令,分支、迴圈、跳轉、異常處理等資訊。

垃圾**部分:

hotspot vm分為了年輕代(young)、老年代(tenured)和永久區(perm)。年輕代又被分為1個eden區和兩個survivor區(分別叫from和to),其中eden是物件的出生地,每經歷一次gc並且存活下來則「年齡」增長一歲,進行至少一次gc並且存活下來後進入survivor區,而若到了指定的年齡(預設是15歲)仍未**,則有機會進入老年代。

**演算法

1、標記 — 清除演算法:分為兩階段:第一階段先從引用根節點開始標記所有被引用的物件,第二階段遍歷整個堆,把未標記的物件清除。需要暫停整個應用,但是會產生記憶體碎片。

2、複製演算法:將記憶體分為兩個區域,使用的只有其中乙個區域,當進行垃圾**時,遍歷正在使用的區域,直接將所有存活物件複製到未使用的區域中,因此是進行垃圾**的同時也進行了記憶體整理,不會出現記憶體碎片問題。

3、標記 — 整理演算法:此演算法結合了以上兩種演算法,也是分為兩階段,第一階段從根節點開始標記所有被引用物件,第二階段遍歷整個堆,消除未標記物件並且把存活物件「壓縮」到堆的一頭,按順序排放,避免了標記 — 清除演算法的碎片問題,同時也避免了複製演算法的空間問題。

jvm記憶體組成 GC

1.jvm記憶體組成 堆 除基本型別之外所有new的物件儲存在堆。棧 儲存一些區域性變數 臨時儲存 本地方法棧 只要支援其他語言的方法,儲存native方法的狀態 方法區 存放類資訊,靜態資訊,final常量資訊,屬性,方法等。主要存放於持久代。程式計數器 pc 2.堆是由新生代和舊生代組成,new...

JVM的GC中物件的age以及JVM記憶體的分配策略

young generation中的gc叫minor gc,eden中的物件拷貝到s。old generation中的gc叫full gc。age,官方文件預設為15,age也相當於計數器,每次gc,age 1,age代表gc的次數。在gc時,s中的物件的age一樣的這批資料大於s空間1 2的話,此...

jvm記憶體結構

方法區用於存放類 class檔案 的相關資訊,如類名,訪問修飾符 常量池 字段描述 方法描述等資訊。方法區的一部分,存放編譯時期生成的各種字面量和符號引用,例如 字串!每個方法被執行的時候都會同時建立乙個棧幀用於存放方法內部的區域性變數等資訊。每乙個方法被呼叫直至執行完成的過程,就對應著乙個棧幀在虛...