JVM(JAVA virtual Machine)是能夠運行Java代碼的假想計算機,他是運行在操做系統上的。每一種平臺的解釋器不一樣,可是實現的虛擬機是相同的,這也就是Java爲何可以跨平臺的緣由了。算法
JVM容許一個應用併發執行多個線程。當線程本地儲存,緩衝區分配,棧,程序計數器準備好後,就會建立一個操做系統原生線程。Java線程結束,原生線程隨之被回收, 同時釋放全部相關資源。數組
生命週期與線程相同,用戶線程啓動/結束,而建立/銷燬併發
線程共享區隨虛擬機的啓動/關閉,而建立/銷燬操作系統
新生代通常用來存放新生的對象,佔據堆1/3的空間,會頻繁觸發MinorGC。線程
MinorGC採用複製算法,首先把eden,survivorFrom的存活對象複製到survivorTo區,再把他們的年齡+1。接下來清空eden,survivorFrom中的對象,並把survivorTo 和 survivorFrom互換,原survivorTo內的對象會成爲下一次GC的survivorFrom區。對象
老年代對象穩定,通常在執行MajorGC前都會進行一次MinorGC。 MajorGC採用標記清除算法,掃面全部對象,標記存活對象後回收全部沒有標記的對象。生命週期
GC不會在主程序運行期間對永久區進行清理,因此可能出現隨着加載class的增多而拋出OOM異常的情況內存
JAVA8中,永久代已經移除,被元數據區取代。他並不在虛擬機中,而是使用本地內存。這樣,元數據區的大小僅受本地內存限制資源