天天看點

java記憶體管理

一、jvm記憶體結構

程式計數器(program counter register)、jvm虛拟機棧(jvm stacks)、本地方法棧(native method stacks)、堆(heap)、方法區(method area) (1)pcr 跟随線程生命周期,記錄目前執行到的.class位元組碼行數,用于多線程操作 (2)jvm stacks 跟随線程生命周期,在方法執行中存儲資料
java記憶體管理
(3)native method stacks 處理native方法,如object中的hashcodes()等 (4)heap 存儲所有執行個體對象和數組對象,内置gc (5)method area 堆的組成部分,但不強制gc。存儲的對象為運作時常量池、靜态變量、jvm加載的類資訊等

二、垃圾回收

堆和方法區需要進行垃圾回收,其他三個随線程生命周期建立銷毀 垃圾判定算法 (1)引用電腦:對循環引用的對象無法回收 (2)根搜尋:效率較低 垃圾清除算法 (1)标記、清除算法   過程:記憶體緊張時,停止程式,周遊gc root将可達的對象标記出可存活的對象,清除所有未使用的對象   缺點:效率較低;清理出來的空閑記憶體不連續 (2)複制算法   過程:将記憶體分成活動區間和空閑區間兩塊,新配置設定的記憶體在活動區間,記憶體緊張時進行gc,将活動區間中             存活的對象,按順序放入空閑區間   缺點:浪費一半記憶體;對象存活率高時比較費複制操作 (3)标記、整理算法   過程:類似(1)标記所有存活對象,重新移動按記憶體順序排列對象,将末端記憶體清除   缺點:效率不高 (4)分代搜尋算法   過程:針對不同對象進行不同的回收算法。   夭折對象(局部變量、臨時變量):複制算法(80%記憶體配置設定對象+10%活動區間+10%空閑區間)   老不死對象(緩存對象、資料庫連接配接對象、單例對象):标記、整理算法   不滅對象(string池對象、class類資訊):标記、整理算法