JAVA虛擬機的組成>從零開始學java系列

JAVA虛擬機的組成

什麼是虛擬機?

虛擬機是運行在隔離環境下的完整的計算機系統,JAVA虛擬機對字節碼進行解釋、生成對應的機器碼並進行執行。是JAVA跨平臺的緣由。java

JAVA虛擬機的組成部分

  • 堆區
  • 方法區(永久代)
  • 虛擬機棧
  • 本地方法棧
  • 程序計數器

堆區(堆內存)

堆內存因爲是垃圾回收的主要區域,也被稱之爲GC堆,其主要是用於存放對象實例,這塊區域被全部的線程共享,堆內存還細分爲如下區域線程

  1. 新生代(存活區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區老是有一個區是空的
  2. 老年代
    存放from區放進來的對象實例,老年代滿了後會進行Major GC(清除老年代) 或者Full GC(全量回收,會將新生代的一塊兒回收)
  3. 永久代(方法區)(元空間)
    用於存儲已被JAVA虛擬機加載的類信息、常量、靜態變量、靜態方法等...不會進行垃圾回收

方法區

在JDK1.8以前叫作方法區
在JDK1.8以後刪除了方法區,更名爲了元空間對象

虛擬機棧

用於存放對象的引用、基本數據類型、基本數據類型的值、局部變量。以及從堆內存中加載方法進虛擬機棧進行運行。內存

本地方法棧

使用Native本地方法服務字符串

程序計數器

每一個線程都會有一個獨立的程序計數器,能夠理解爲記錄線程執行字節碼文件的行數虛擬機

字符串常量池

JDK6及其之前,字符串常量池存放在堆區的永久代中
JDK7以後,字符串常量池存放在普通的堆內存中class

相關文章
相關標籤/搜索