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];1.1 堆主函式進棧 -> 在棧中定義乙個 arr 變數 -> 在堆裡通過new開闢乙個空間,這個空間會產生乙個位址,這個位址下的所有所有會進行初始化 -> 把記憶體的位址賦值給 arr
int arr = null; arr不做任何指向,null的作用就是取消引用資料型別的指向
堆又分為
老年代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...