關於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棧中彈出。
四,放個大圖