JAVA虛擬機的組成
什麼是虛擬機?
虛擬機是運行在隔離環境下的完整的計算機系統,JAVA虛擬機對字節碼進行解釋、生成對應的機器碼並進行執行。是JAVA跨平臺的緣由。java
JAVA虛擬機的組成部分
- 堆區
- 方法區(永久代)
- 虛擬機棧
- 本地方法棧
- 程序計數器
堆區(堆內存)
堆內存因爲是垃圾回收的主要區域,也被稱之爲GC堆,其主要是用於存放對象實例,這塊區域被全部的線程共享,堆內存還細分爲如下區域線程
- 新生代(存活區Survivor)
1.1 Eden區,用於存放新建立的對象,當滿了的時候會進行 minor GC。當進行了minor GC後,存活下來的對象(還有引用指向的對象)會被放到該from區。
1.2 from區,用於存放通過了minor GC後還存活的對象實例,每通過一次minor GC年齡都會加1。而且每次進行minor GC時,都會經過對象實例的年齡來判斷其去向,年齡到達了老年代的標準(默認15歲)會被放到老年代中,未到年齡會被複制到to區(這個時候to區就會變成新的from區),不可達對象會被回收。
1.3 to區,用於存放通過了minor GC後還存活的對象實例,與from的做用一致
提示:from區與to區老是有一個區是空的
- 老年代
存放from區放進來的對象實例,老年代滿了後會進行Major GC(清除老年代) 或者Full GC(全量回收,會將新生代的一塊兒回收)
- 永久代(方法區)(元空間)
用於存儲已被JAVA虛擬機加載的類信息、常量、靜態變量、靜態方法等...不會進行垃圾回收
方法區
在JDK1.8以前叫作方法區
在JDK1.8以後刪除了方法區,更名爲了元空間對象
虛擬機棧
用於存放對象的引用、基本數據類型、基本數據類型的值、局部變量。以及從堆內存中加載方法進虛擬機棧進行運行。內存
本地方法棧
使用Native本地方法服務字符串
程序計數器
每一個線程都會有一個獨立的程序計數器,能夠理解爲記錄線程執行字節碼文件的行數虛擬機
字符串常量池
JDK6及其之前,字符串常量池存放在堆區的永久代中
JDK7以後,字符串常量池存放在普通的堆內存中class