JVM 記憶體管理

2022-07-09 13:51:12 字數 838 閱讀 8854

date: 2020-10-29 16:30:00

updated: 2020-10-29 17:10:00

參考文件

jvm記憶體劃分:

暫存器(程式計數器pc拿到指令位址,放入指令暫存器ir中,cpu執行指令)

本地方法區

方法區棧記憶體(stack)

堆記憶體(heap,不是資料結構中的堆)

int arr = new int[3];

主函式進棧 -> 在棧中定義乙個 arr 變數 -> 在堆裡通過new開闢乙個空間,這個空間會產生乙個位址,這個位址下的所有所有會進行初始化 -> 把記憶體的位址賦值給 arr

int arr = null; arr不做任何指向,null的作用就是取消引用資料型別的指向

1.1 堆

堆又分為

老年代1.2 棧

每個執行緒執行每個方法的時候都會在棧中申請乙個棧幀,每個棧幀包括區域性變數區和運算元棧,用於存放此次方法呼叫過程中的臨時變數、引數和中間結果

新生代gc

新生代通常存活時間較短,因此基於複製演算法來進行**,所謂複製演算法就是掃瞄出存活的物件,並複製到一塊新的完全未使用的空間中

新生代滿了後,會把物件轉移到舊生代,然後清空繼續裝載,當舊生代也滿了後,就會報outofmemory的異常

老年代gc

老年代物件存活的時間比較長,比較穩定。因此採用標記(mark)演算法來進行**,所謂標記就是掃瞄出存活的物件,然後再進行**未被標記的物件,**後對用空出的空間要麼進行合併,要麼標記出來便於下次進行分配,總之就是要減少記憶體碎片帶來的效率損耗

JVM自動記憶體管理

可 物件的判定方法 引用計數演算法 給物件新增乙個引用計數器,每乙個引用它的地方時,就 1,失效就 1,為0時候就是不能再被用了。缺陷 注意迴圈引用,就是你用我的,我用你的,叫做死鎖吧,引用計數器是1,無法 a.b b b.a a 現在主流的jvm沒有使用這個演算法。可達性分析演算法 通過一系列稱為...

jvm記憶體管理(二)

關於物件訪問 object o new object 此語句將會在 堆中 開闢空間儲存 new object 的例項資訊,同時還必須包括物件型別,父類,實現的介面,方法等資訊的位址資訊 這些儲存在方法區中 reference 型別 儲存的是指向物件的引用,具體的實現方式根據jvm的不同,一般有兩種 ...

JVM的記憶體管理

我們知道類中的靜態變數在程式執行期間,其記憶體空間對所有該類的物件例項而言是共享的,為了節省系統記憶體開銷 共享資源,應該將一些變數宣告為靜態變數。通過下面的例子,你就會發現有什麼不同。一 1 public class memorytest 9 1011 data weeks 2021 public...