jvm記憶體結構:
線程共享:堆,方法區
非線程共享: 虛拟機棧,本地方法棧,程式計數器
堆:所有的執行個體對象以及數組都要在堆上配置設定 ,從記憶體回收角度看: 細分為 新生代 和 老生代 是垃圾收集器管理的主要區域。
方法區:存儲已被虛拟機加載的類資訊、常量、靜态變量、即時編譯器(jit)編譯後的代碼
記憶體回收的主要目标:針對常量池的回收和對類型的解除安裝 垃圾比較少回收這個區域。
string.intern()方法 注意(參考深入 了解java虛拟機)
虛拟機棧: 線程私有,生命周期與線程相同 為虛拟機執行java方法(位元組碼)服務
描述的是java方法執行的記憶體模型 :
每個方法被執行時同時會建立一個棧幀 用于存儲局部變量表 、操作棧、動态連結、方法出口資訊。方法被調用到執行完 對應着棧幀在虛拟機棧中從入棧到出棧的過程
本地方法棧:為虛拟機使用到的native方法服務
程式計數器:線程私有 目前線程所執行的位元組碼的行号訓示器。記錄正在執行的虛拟機位元組碼指令的位址。
jvm垃圾回收機制:
gc的基本原理:找到程式中不再被使用的對象,然後回收這些對象所占用的記憶體空間。
gc判斷對象不再使用的算法:
對象存活判斷算法:引用計數算法和根搜尋算法
基本的垃圾回收算法:标記-清除、複制、标記-整理,分代收集算法
依賴線程實作的回收算法:串行、并行、并發
其中對象存活判定算法是其他算法的基石,用來判斷對象是否存活,能否回收;基本的垃圾回收算法是垃圾垃圾收集器實作的基礎算法;而依賴線程實作的算法,則是基本算法在考慮線程環境下的運用,這個有多線程基礎的看名字就明白了。此外,還有綜合以上算法并從特定角度實作的算法,如分代回收(針對分區)、增量回收(針對實時性)
記憶體配置設定和回收政策
1.對象優先在新生代 eden上配置設定
2.大對象直接進入老年代
3.長期存活的對象将進入老年代(動态對象年齡判定)