小馬之博客初體驗暨JVM基礎一開篇
- 開篇閑談
- JVM基礎知識
- java程式運行程序
- JVM、JRE、JDK 的關系
- JVM的記憶體區域
- 運行時資料區
- 虛擬機堆疊
- 堆疊幀
- 后記
開篇閑談
今天是2021年2月22日,是我從機械走向程式猿的第四個年頭,也是我第一篇博客的開始(小馬也是在學習中,有不對的地方希望大佬指正),寫博客這個想法在我腦海里生生滅滅已經好幾輪回,其實一直想著把作業中遇到的問題以及學習中的心得寫下來,為什么一直沒有開始呢,你懂得《懶人總有理由推脫》,廢話不多說,直接開干<希望自己能堅持下來,加油,小馬>,
JVM基礎知識
java程式運行程序

程序:java檔案>>>>編譯器(生成.class檔案)>>>> JVM(位元組碼)>>>> 機器碼
第一步 :javac將java檔案編譯成 .class檔案,
第二步:JVM將.class檔案翻譯,輸出位元組碼,呼叫作業系統函式,
JVM、JRE、JDK 的關系
JVM 就是我們經常說的 java虛擬機,主要就是把.class檔案翻譯成機器識別的碼,
JER java運行時環境,它包含JVM,除了JVM外,主要是提供很多類別庫(比如讀寫或者操作檔案、連接網路、IO等等),這都是JRE提供的基礎的類別庫,
JDK java軟體開發包,它包含JRE,對我們程式猿來言,處理JRE的功能外,我們還需要打包代碼,除錯代碼,有時候還需要反編譯代碼,JDK提供了一些工具(javac<編譯代碼>、jar<打包>、javap<反編譯>)等,這就是JDK,
補充
JVM具有跨平臺性<在不同的作業系統上(Linux、Windows、MacOS 等平臺)執行,效果是一樣>;
跨語言性<JVM 只識別位元組碼,JVM 運行不是翻譯 Java 檔案,而是識別 class 文 件,這個一般稱之為位元組碼>
JVM的記憶體區域

運行時資料區
虛擬機堆疊
基于執行緒,存盤當前執行緒運行 java方法所需的資料,指令,回傳地址,
特點:先進后出<好比手槍子彈夾上子彈,先壓得子彈后出,后壓得先出>
堆疊幀
在java方法被呼叫時,會創建一個堆疊幀,并進入堆疊,當方法完成相應呼叫,則出堆疊,
區域變數表
用于存盤方法中的變數,比如八大基礎型別,如果是區域的一些物件,比如new出的物件,則存放它的參考地址即可,
傳統的作業系統 包含 CPU + 記憶體 + 快取
JVM(模擬板的作業系統)想對應 JVM執行引擎(CPU) + 堆、堆疊 (記憶體) + 運算元堆疊(快取)
運算元堆疊
它本質上是執行引擎的一個作業區,用于存放java方法的運算元的,如果代碼不執行,運算元堆疊就是空的,
動態鏈接
符號參考和直接參考在方法運行時進行決議和鏈接的程序,叫動態鏈接
比如一個方法呼叫另一個方法時,或者一個類使用另一個類的成員變數時,首先我們得知道其名字,
符號參考呢就相當于名字,這些被呼叫者的名字就存放在java位元組碼檔案里(.class檔案)
當程式運行起來,怎么通過這個名字(符號參考)找到相應的類和方法,是通過決議成相對應的直接參考,利用直接參考來準確的找到,
完成出口<回傳地址>
正常回傳:呼叫程式計數器中的地址作為回傳
例外回傳:通過例外處理器表來確定
程式計數器
主要用來記錄各個執行緒執行的位元組碼的地址,比如,分支、回圈、跳轉、例外、執行緒恢復等都依賴于計數器,
由于 Java 是多執行緒語言,當執行的執行緒數量超過 CPU 核數時,執行緒之間會根據時間片輪詢爭奪 CPU 資源,如果一個執行緒的時間片用完了,或者是其它原因導致這個執行緒的 CPU 資源被提前搶奪,那么這個退出的執行緒就需要單獨的一個程式計數器,來記錄下一條運行的指令, 因為 JVM 是虛擬機,內部有完整的指令與執行的一套流程,所以在運行 Java 方法的時候需要使用程式計數器(記錄位元組碼執行的地址或行號),如果是遇到本地方法(native 方法),這個方法不是 JVM 來具體執行,所以程式計數器不需要記錄了,這個是因為在作業系統層面也有一個程式計數器,這個會記錄本地代碼的執行的地址,所以在執行 native 方法時,JVM 中程式計數器的值為空(Undefined), 另外程式計數器也是 JVM 中唯一不會 OOM(OutOfMemory)的記憶體區域,
CPU時間輪轉機制

后記
寫下自己的感受,雖然說這個知識都是基礎,要是口述的話,感覺沒啥壓力,但是呢,要一個字一個字敲到文章里,還是需要點時間的,再有每個知識點呢都需要在確認下(比較菜)生怕哪塊寫的不對,總體來說,自己很充裕,也算是打發時間的最好的方法,還能鞏固知識,那就到這里,下章見~,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262910.html
標籤:java
上一篇:查詢支付寶電話號中隱藏的六位數
