前言
JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行java的字節碼程序。
java編譯器只需面向JVM,生成JVM能理解的代碼或字節碼文件。Java源文件經編譯器,編譯成字節碼程序,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。
這裡就給大家講一下JVM。
技術大咖帶你垂直打擊JVM
- 什麼是運行時數據區? 我們一起來分享。
- 瞭解JVM底層原理,讓你的代碼擼得飛起。
- 搞定內存溢出,漲薪升職。
- 漲見識,字節碼執行過程分析。
- 直擊真相,原理和代碼全都有。
- 測試、效果演示及總結。
JVM是什麼?
JDK: java development kit (Java開發工具包) 編譯、反編譯、調試等。
JRE: java runtime enviroment (Java運行環境)
JVM: java Virtual Mechinal (Java虛擬機) 一次編寫,到處運行!
學jvm的目就是:
提升代碼質量、解決項目問題。
面試!面試!還是面試!
JVM是怎麼玩的
類加載器:Class字節碼文件加載到內存
執行引擎:解析字節碼指令,得到執行結果
運行時數據區
JVM運行時數據區
線程私有
- 程序計數器
- 虛擬機棧
- 本地方法棧
線程共享
- 堆
- 方法區
BAT的JVM面試題
JVM什麼情況下會發生棧內存溢出?
JVM中一次完整的GC流程是怎樣的?
- GC——垃圾回收
- 完整意味著有多種情況
程序計數器
指向當前線程正在執行的字節碼指令的地址(行號)
棧是什麼?
棧(Stack)
- 入口和出口只有一個
- 入棧
- 出棧
FILO
- 先進後出
虛擬機棧
虛擬機棧
創建一個線程就為線程分配一個虛擬機棧,它又會包含多個棧幀,因為每運行一個方法就創建一個棧幀。
- 運行時才有數據
棧幀
運行一個線程中的一個方法
- 局部變量表
- 操作數棧
- 動態連接
- 返回地址
深入理解虛擬機棧
演示一段代碼的方法的執行過程
代碼:
public int calc(){
int a=100;
int b=200;
int c=300;
return(a+b)*c;
}
虛擬機棧的異常
StackOverFlowError異常
- 原因:執行的虛擬機棧深度大於虛擬機棧允許的最大深度(方法的遞歸調用)。
- 解決辦法:增加默認棧的容量。
棧容量 -Xss 默認1M
OutOfMemeoryError異常
- 原因:多線程環境下虛擬機在擴展棧時無法申請到足夠的內存空間。
- 解決辦法:減少默認棧的容量來換取更多的線程支持。
JVM中線程共有的內存區域
Java堆
- Java堆是被所有線程共享的一塊內存區域
- 所有的對象實例以及數組要在堆上分配
元數據區
- 老版本名稱:方法區(永久代)
- 類信息、常量、編譯後的代碼信息
直接內存
以上源於一個視頻講解的概述總結,後續將分享後半部分的內容:
- 可達性分析算法——GC Roots
- JVM中的堆
- 新生代為什麼分三個區?
- 新生代對象的分配和回收
- 老年代對象的分配和回收
- JVM中一次完整的GC流程是怎樣的?
如果有興趣想了解視頻具體內容的可以關注我,私信“架構”即可獲取原視頻。
還有一些Java架構視頻講解,需要獲取Dubbo、Redis、設計模式、Netty、zookeeper、Spring cloud、分佈式、高併發等架構技術視頻教程資料,架構思維導圖,和BATJ面試題及答案的,都是免費分享的。
關注我,私信“架構”即可獲取視頻。