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

工作3年的程序員出去面試,結果連JVM怎么運行都不知道

開發 前端
今天給大家分享一個知識點,那就是平時我們寫好的 Java 代碼,他是如何運行起來的,以及他運行起來以后是如何變成 JVM 進程的?然后 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 運行原理了。

責任編輯:姜華 來源: 今日頭條
相關推薦

2019-07-12 15:28:41

緩存數據庫瀏覽器

2021-03-01 19:13:45

YAML程序員數據

2021-02-08 22:32:43

程序員 靜態網頁

2018-05-08 15:30:46

程序員代碼框架

2020-11-20 06:13:04

Like %

2020-12-21 09:00:04

MySQL緩存SQL

2011-08-23 13:50:17

程序員

2022-08-08 11:13:35

API接口前端

2018-10-17 14:50:08

2020-12-21 09:44:53

MySQL查詢緩存數據庫

2021-02-23 07:10:54

Redis數據庫緩存

2018-09-20 17:05:01

前端程序員JavaScript

2020-02-25 15:29:04

程序員35歲以后怎么辦

2023-01-05 23:18:06

CPU線程

2020-04-03 08:42:08

Servelt3程序員Tomcat

2013-11-21 13:35:19

程序員牛人

2021-03-05 15:14:47

程序員數據開發

2016-03-14 11:58:10

面試工作經驗程序員

2025-04-17 02:30:00

2020-07-29 09:53:09

VSCode編碼工具插件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人精品午夜视频免费 | 亚洲视频中文 | 色吊丝2288sds中文字幕 | 亚洲国产精品第一区二区 | 久久99精品国产 | 国产精品久久久久久久久久 | 亚洲午夜三级 | 91久久久久久久久久久久久 | 精品久久伊人 | 免费在线成人 | 天天色综 | 亚洲一区二区三区高清 | 中文字幕亚洲一区二区三区 | 国产日韩一区二区三区 | 四虎永久在线精品免费一区二 | 成人国产免费视频 | 午夜精品在线 | 99精品国产一区二区三区 | 毛片一级片 | 久久综合狠狠综合久久综合88 | 成人精品一区二区三区中文字幕 | 成人福利视频 | 欧美精品欧美精品系列 | 日韩午夜| www.99re5.com| 日韩欧美精品在线播放 | 亚洲精品一区二区三区蜜桃久 | 好姑娘影视在线观看高清 | 欧美一区二区三区的 | 欧美区在线 | 亚洲国产一 | 99在线免费观看 | 美女天天干天天操 | 午夜伊人| 久久99精品国产99久久6男男 | 国产精品无码久久久久 | 国产精品自产拍在线观看蜜 | 91黄在线观看 | 99久久久久久99国产精品免 | 久久精品欧美一区二区三区不卡 | 亚洲精品久久久久中文字幕二区 |