JVM隨筆:
JVM發展:Classic VM —>HotSpot VM+JRokit VM —>整合HotSpot VM(主流jvm)
JVM源碼結構
- JVM內存區域:
JVM內存區域共分爲5大塊。分別爲堆內存(Heap),方法區(Method Area),本地方法棧(Native Method Stack),虛擬機棧(JVMStacks)和程序計數器;
堆內存:主要儲存 java 方法在運行過程中 new 出來的對象->String str = new String();則new String()則存儲於堆內存中,GC垃圾收集器(分代回收算法)主要工作於此區域,所有線程共享些區域,易出現OutOfMemoryError異常。
方法區:主要儲存經過JVM加載之後的類信息class,常量 final,靜態變量 static和編譯後的代碼等數據,垃圾回收器也將作用於此區域進行廢棄數據回收。
虛擬機棧:主要儲存局部變量(byte,boolean,char,short,float,int,double,long)以及對象的引用String str = new String()–>str,操作數棧,動態鏈接,方法出口等信息。每個java方法執行時會創建一個棧楨,棧楨的入棧到出棧 對應着一個java方法調用開始直至結束的過程。爲 JVM執行java方法服務。操作數棧是JVM的一個工作區->加法運算->JVM使用指令將兩個數從局部變量中提出來,然後壓入到操作數棧中,再執行加法操作,最後將結果壓入到操作數棧中,再將操作棧中的結果值儲存到局部變量的索引中,以索引引出結果展示。
本地方法棧:主要儲存程序中使用到的 Native方法(非java語言編寫)—>java調用非java代碼的接口:native public void Native1( int x ) ;
程序計數器:較小的內存區間,主要儲存當前線程執行到某個位置,通過計數器的值來選擇下一條需要執行的字節碼指令,程序的分支,集合的循環,方法之間的跳轉或者異常處理等都需要根據程序計數器來指定,每個線程獨立擁有一個程序計數器。