JAVA是如何運行的

關於JAVA是如何運行的一直很模糊 今天來總結下

一,首先先理解幾個基本概念:

  • JDK(Java Development Kit),Java開發工具包,主要用於開發
  • JRE(Java Runtime Environment),Java程序運行的核心環境,包括JVM和一些核心庫
  • JVM(Java Virtual Machine),VM是一種用於計算設備的規範,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的,是JRE核心模塊。

二 ,我們要知道運行時java會做什麼事

      首先任何.java文件都會被javaC.exe 編譯成JVM可以運行的.class文件

Main.java

package com.company;

public class Main {

    public static void main(String[] args) {
	// write your code here
        System.out.printf("Hello World");
    }
}

Main.class

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.company;

public class Main {
    public Main() {
    }

    public static void main(String[] var0) {
        System.out.printf("Hello World");
    }
}

 流程入下:

JVM 會將字節碼讀取之運行時數據區,然後從main方法開始執行字節碼。執行過程如下:

三,通過上圖,可以看到ClassLoad會將Class文件 以及用到的java api 讀取到數據區,然後根據不同的內容將數據存儲到不同的內存區域。

運行時數據區可大致分爲:方法區,堆區,棧區,PC寄存器區和本地方法棧區,這也就是常說的JAVA內存結構。

1、方法區

方法區用來存儲解析被加載的class文件的相關信息。

當虛擬裝載一個class文件後,它會從這個class文件包含的二進制數據中解析類型信息,然後將該相關信息存儲到方法區中。

2.堆

堆是用來存儲相關引用類型的,如new對象。當程序運行時,虛擬機會把所有該程序在運行時創建的對象都放到堆中。

3.PC寄存器

PC寄存器主要用來存儲線程。當新創建一個線程時,該線程都將得到一個自己的PC寄存器(程序計數器)以及一個java棧。

Java虛擬機沒有寄存器,其指令集使用Java棧來存儲中間數據。

4.棧區

棧區主要用來存儲值類型的,如基本數據類型。需要注意的是,String爲引用類型,是存在堆中的。

Java棧是由許多棧幀組成的,一個棧幀包含一個Java方法調用的狀態,當線程調用一個方法時,虛擬機壓入一個新的棧幀到該線程的Java棧中,當該方法返回時,這個棧幀從Java棧中彈出。

 

四,放個大圖

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章