一文帶你理解JVM原理

JVM

基本概念

JVM(JAVA virtual Machine)是能夠運行Java代碼的假想計算機,他是運行在操做系統上的。每一種平臺的解釋器不一樣,可是實現的虛擬機是相同的,這也就是Java爲何可以跨平臺的緣由了。算法

線程

JVM容許一個應用併發執行多個線程。當線程本地儲存,緩衝區分配,棧,程序計數器準備好後,就會建立一個操做系統原生線程。Java線程結束,原生線程隨之被回收, 同時釋放全部相關資源。數組

JVM 內存區域

線程私有

生命週期與線程相同,用戶線程啓動/結束,而建立/銷燬併發

程序計數器 Program Counter Register

  • 一塊較小的內存空間,每一個線程都有一個獨立的程序計數器,在這裏記錄的是虛擬機字節碼指令的地址(即當前指令的地址)

虛擬機棧 VM Stack

  • 每一個方法在執行時都會建立一個棧幀(Stack Frame)用於儲存局部變量表,操做數棧,動態連接,方法出口等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中從入棧到出棧的過程
  • 棧幀隨着方法調用而建立,隨着方法結束而銷燬,不管方法時正常完成仍是異常完成都算做方法結束

本地方法棧 Native Method Stack

  • 和虛擬機棧相似,區別爲虛擬機棧爲Java方法服務,而本地方法棧爲Native方法服務

線程共享

線程共享區隨虛擬機的啓動/關閉,而建立/銷燬操作系統

堆 Heap

  • 保存全部建立的對象,數組
  • 垃圾收集器進行的最重要內存區域

方法區/永久代 Method Area

  • 保存全部被JVM加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據
  • 運行時常量池 Runtime Constant Pool也是方法區的一部分,用於存放編譯期生成的各類字面量和符號引用

JVM 運行時內存

新生代

新生代通常用來存放新生的對象,佔據堆1/3的空間,會頻繁觸發MinorGC。線程

MinorGC採用複製算法,首先把eden,survivorFrom的存活對象複製到survivorTo區,再把他們的年齡+1。接下來清空eden,survivorFrom中的對象,並把survivorTo 和 survivorFrom互換,原survivorTo內的對象會成爲下一次GC的survivorFrom區。對象

Eden

  • Java新對象的出生地,當這個區域內存不夠時就會觸發MinorGC

SurvivorFrom

  • 上一次GC的倖存者,這一次GC的被掃描者

SurvivorTo

  • 保留了一次MinorGC過程當中的倖存者

老年代

老年代對象穩定,通常在執行MajorGC前都會進行一次MinorGC。 MajorGC採用標記清除算法,掃面全部對象,標記存活對象後回收全部沒有標記的對象。生命週期

永久代

GC不會在主程序運行期間對永久區進行清理,因此可能出現隨着加載class的增多而拋出OOM異常的情況內存

元數據

JAVA8中,永久代已經移除,被元數據區取代。他並不在虛擬機中,而是使用本地內存。這樣,元數據區的大小僅受本地內存限制資源

相關文章
相關標籤/搜索