1. 程式人生 > >jvm個人理解

jvm個人理解

jvm

java堆圖解:


技術分享圖片

類加載子系統:負責從文件或網絡加載class信息,存放在方法區的內存空間中。

方法區:存放類信息、常量信息、常量池信息、包括字符串和數字常量

java方法區和堆一樣,方法區是一塊所有線程共享的內存區域,它保存系統的類信息,比如類的字段。方法區的大小決定了系統可以保存多少個類,如果系統定義太多的類,導致方法區溢出。虛擬機同樣會拋出內存溢出錯誤。方法區可以理解為“”永久區“”(Perm)


堆:在java虛擬機啟動的時候建立堆,它是java程序最主要的內存工作區域,幾乎所有的對象實例都存放到java堆中,堆空間是所有線程共享的

直接內存:java的NIO庫允許java程序使用直接內存,從而提高性能,通常直接內存速度會優於java堆。讀寫頻繁的場合可能會考慮使用

棧:每個虛擬機線程都有一個私有的棧,一個程序的java棧在線程創建的時候被創建,java棧中保存著局部變量、方法參數、同時java的方法調用、返回值等

局部變量表:用於報錯函數的參數及局部變量

操作數棧:主要保存計算過程的中間結果,同時作為計算過程中變量臨時的存儲空間

幀數據區:除了局部變量表和操作數棧以外,棧還需要一些數據來支持常量池的解析,這裏幀數據區保存

著訪問常量池的指針,方便程序訪問常量池,另外,當函數返回或出現異常時,虛擬機必須有一個異常處理表

方便發送異常的時候找到異常的代碼,因此異常處理表也是幀數據區的一部分


垃圾收集算法(核心算法,其他算法略)

復制算法:其核心思想就是將內存空間分為2塊,每次只使用其中1塊,在垃圾回收時,將正在使用的內存中的存留

對象復制到未被使用的內存塊中去,之後去除之前正在使用的內存塊中所有的對象,反復去交換2個內存

的角色,完成垃圾收集(java中新生代的from和to空間就是使用的這個算法)

標記壓縮法:標記壓縮法在標記清除法的基礎上做優化,把存活的對象壓縮到內存一端,而後進行垃圾清理(java老年代使用的這個算法)

分代算法:根據對象的特點把內存分成n塊,而後根據每個內存的特點使用不同的算法、

對於新生代和老年代來說,新生代回收率很高,但是每次回收耗時很短,老年代回收率低,耗時較長,所以應該盡量減少老年代的GC

分區算法:將整個內存分為n多個小的獨立空間,每個小的空間可以獨立使用,細粒度的控制每一個空間,而不是對整個空間進行GC,從而提高性能,減少GC的停頓





jvm個人理解