成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們的Java代碼啟動之后,是如何神奇地變成JVM進程的?

開發 前端
我們就可以來總結一下咱們寫好的 Java 代碼是如何一步一步運行起來的,如何變成一個 JVM 進程在不斷地運行的了。

知識點

今天給大家分享一個知識點,那就是平時我們寫好的 Java 代碼,他是如何運行起來的,以及他運行起來以后是如何變成 JVM 進程的?然后 JVM 進程又是如何運行我們寫的代碼的?

這些問題想必很多寫了很久 Java 的兄弟可能都不太清楚,今天我們就來好好聊聊這些問題。

寫好的 Java 代碼,他是如何運行起來的?

首先,咱們平時開發一個 Java 系統,其實說白了就是在自己本地的 Intellij IDEA 里寫一大堆的 Java 代碼。

這些 Java 代碼其實都是一些后綴為 .java 的文件,咱們寫好的 Java 代碼都是存放在這些 .java 后綴的文件里的,本質跟我們用 word 寫一個后綴為 .doc 的文檔沒啥區別。

如下圖:

接著呢,假設你已經寫好了一些代碼,現在想把代碼運行起來了,此時就應該要先做一個事情,那就是編譯。

這個編譯的話,意思就是說,你寫好的 Java 代碼,咱們的計算機是看不懂的,必須得把寫好的代碼編譯成計算機能看懂的機器語言,就是字節碼,所以這個時候我們就得先做編譯這個動作。

當然平時你要是用 Intellij IDEA 的話,其實他自動就給你把代碼編譯好了,編譯好的字節碼文件就是 .class 后綴的。

如下圖:

接著呢,最關鍵的點來了,如果你是自己要運行代碼,可以在命令行里對 .class 字節碼文件發出 java 命令,如果你是用 Intellij IDEA 的,那么你點擊運行代碼按鈕,人家自動就給你先編譯代碼,然后他自己直接用 java 命令來運行 .class 字節碼文件了。

如下圖:

他運行起來以后是如何變成 JVM 進程的?

此時 java 命令一旦發出,直接就會啟動一個 JVM 進程,所以說,JVM 進程就是這么來的。

大家要注意,你任何 Java 類系統的運行都離不開 JVM 進程,當你用 java 命令運行你的代碼的時候,就一定會啟動一個 JVM 進程,接下來的事兒,就得交給這個 JVM 進程了。

如下圖:

接著下一步,這個 JVM 進程必須要干一個事情,那就是類加載,就是說他必須得把我們寫好的類一各一個加載到內存里來,然后包括加載我們的 .class 字節碼指令,接著才能運行我們寫的代碼。

這個時候第一個要加載的類就是包含 main 方法的主類,這個類就會第一個被加載到內存里來,同時這個類里的字節碼指令也都是要開始被執行的。

如下圖:

因此這個時候 JVM 有兩個東西就可以引出來了,一個是方法區,或者現在 Java 新版本也可以叫做元數據區,就是這個區域是存放我們加載到內存里的類的。

另外一個是程序計數器,就是這個東西是存放我們要運行的下一條字節碼指令的,有人可能會說,這個字節碼指令是什么?

你大概可以認為,字節碼指令就是我們的方法里寫的代碼,這些代碼會轉化為字節碼指令,通過字節碼指令運行我們的代碼邏輯。

如下圖:

給大家一點稍微形象點的例子,大家看下面一個包含 main 方法的類的代碼:

public class Application {     
public static void main(String[] args) {
// 一大堆的代碼
}
}

JVM 進程又是如何運行我們寫的代碼的?

那所以當我們的 JVM 進程啟動之后,針對這個 Application 類,是不是得加載出來扔進自己的方法區這個內存區域里?然后接著 JVM 進程是不是得執行 main 方法里一行一行的代碼?怎么執行代碼?

代碼編譯的時候都搞成字節碼指令了,這個時候就得通過程序計數器去引用一條一條的字節碼指令,然后通過 CPU 去運行每條指令,就等于是在運行我們的每一行代碼了。

如下圖:

接著呢在字節碼指令運行的過程中,可能會發現你的方法里會有一些局部變量,同時還會創建一些對象,局部變量會引用你創建出來的對象。

具體代碼可能類似于下面這樣子,大家參考一下:

public class Application {     
public static void main(String[] args) {
User user = new User();

}
}

這個時候會發生什么事情呢?也很簡單,對于那個 User user,這是一個方法內的局部變量,這種變量人家代碼指令在運行期間,是會扔到一個地方叫做棧內存里去的。

這個棧內存就是放你的方法代碼運行期間的局部變量的,然后你用 new User() 創建的對象呢?

這種對象是放到堆內存里去的,這個堆內存是專門放對象的,而且棧內存里的變量會指向堆內存里的對象。

如下圖:

最后一個概念就是線程,JVM 進程實際上會默認開啟一個 main 線程來運行 main 方法里的代碼,也就是 main 方法里的字節碼指令。

另外你也可以在代碼中開啟別的線程的并發運行別的代碼了,所以其實還應該引入一個線程執行代碼的概念。

如下圖:

總結

到此為止,我們就可以來總結一下咱們寫好的 Java 代碼是如何一步一步運行起來的,如何變成一個 JVM 進程在不斷地運行的了。

首先我們的 Java 代碼得編譯成字節碼,其次我們得用 java 命令啟動一個 JVM 進程,接著 JVM 進程會加載我們寫好的類到方法區里去,同時還會啟動一個默認的 main 線程,通過程序計數器去指向我們的 main 方法里的一條一條的指令,通過 CPU 來運行指令。

接著我們方法的代碼指令運行期間,對于局部變量都會扔棧內存里去,對于創建的對象就會扔堆內存里去。

隨著一個方法運行完畢,就會把這個方法的變量從棧內存里清理掉,然后方法運行期間創建的對象在堆內存里就沒人引用了,此時過一段時間以后也會被 JVM 的一個垃圾回收線程給回收掉這些沒人用的對象,這就是咱們的 JVM 運行原理了。

責任編輯:武曉燕 來源: 石杉的架構筆記
相關推薦

2024-09-10 08:39:48

JVMJava程序

2018-09-07 18:14:37

2023-10-07 08:41:42

JavaJVM

2012-09-25 09:14:28

旁觀者效應負面效應代碼

2022-07-05 21:53:26

記錄圖片WebP

2022-05-24 06:07:48

JShack用戶代碼

2015-04-01 13:15:04

2009-06-25 09:11:47

Java之父GoogleJava

2021-09-01 09:54:10

IP地址域名

2022-10-29 17:34:18

JVMJava

2018-05-15 10:34:50

JavaScript語言互聯網

2012-12-10 15:12:43

2022-04-21 15:28:56

數據安全數據泄露安全證書

2012-08-27 09:10:05

JVMJava

2017-04-05 11:10:23

Javascript代碼前端

2012-07-25 09:15:16

盜版者客戶

2022-06-26 23:41:40

人工智能機器算法

2024-11-21 08:31:07

耗資源神秘進程

2021-06-30 14:11:01

JVM對象池Java

2021-09-08 17:16:00

JVM反射 Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩精品a在线观看图片 | 国产乱码精品一区二区三区中文 | 亚洲成人999 | 久久午夜精品 | www.久草.com| 在线一区视频 | 亚洲精品9999 | 四虎影院新地址 | 亚洲欧美日韩在线一区二区 | 日韩毛片播放 | 黄色av免费 | 中文字幕日本一区二区 | 国产亚洲精品美女久久久久久久久久 | 亚洲最大福利网 | 亚洲第一av网站 | 亚洲+变态+欧美+另类+精品 | 国产欧美日韩一区二区三区在线 | 欧美日韩中 | 欧美一区二区三区在线观看视频 | 国产乱码精品一区二区三区五月婷 | 中文字幕91 | 国产一区二区三区免费观看在线 | 91麻豆精品国产91久久久久久 | 久久久久久久久久久久久九 | 九九精品在线 | 国产成人99久久亚洲综合精品 | 亚洲一区中文字幕 | 亚洲精品一二区 | 一区二区三区四区免费视频 | 国产中文字幕在线 | 亚洲天堂久久新 | 亚洲一区二区在线 | 夜夜撸av | 国产va| 99久久久无码国产精品 | 中文字幕亚洲精品在线观看 | 一区视频在线播放 | 天堂中文字幕av | 久久久久久久久久久久久9999 | 亚洲一区久久久 | 日韩欧美在线观看 |