Java程序員:不識Jvm真面目,只緣身在增刪查改中

前言

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虛擬機) 一次編寫,到處運行!

clipboard.png

學jvm的目就是:

提升代碼質量、解決項目問題。

面試!面試!還是面試!

JVM是怎麼玩的

類加載器:Class字節碼文件加載到內存

執行引擎:解析字節碼指令,得到執行結果

運行時數據區

clipboard.png

JVM運行時數據區

線程私有
程序計數器
虛擬機棧
本地方法棧
線程共享

  • 列表項目

方法區

clipboard.png

BAT的JVM面試題

JVM什麼情況下會發生棧內存溢出?

clipboard.png

JVM中一次完整的GC流程是怎樣的?
GC——垃圾回收
完整意味着有多種情況
程序計數器
指向當前線程正在執行的字節碼指令的地址(行號)

棧是什麼?

棧(Stack)
入口和出口只有一個
入棧
出棧

FILO
先進後出

clipboard.png

虛擬機棧

虛擬機棧
創建一個線程就爲線程分配一個虛擬機棧,它又會包含多個棧幀,因爲每運行一個方法就創建一個棧幀。
運行時纔有數據
棧幀
運行一個線程中的一個方法
1.局部變量表
2.操作數棧
3.動態連接
4.返回地址

clipboard.png

深入理解虛擬機棧

演示一段代碼的方法的執行過程

代碼:

public int calc(){

int a=100;

int b=200;

int c=300;

return(a+b)*c;

}

clipboard.png

虛擬機棧的異常

StackOverFlowError異常
原因:執行的虛擬機棧深度大於虛擬機棧允許的最大深度(方法的遞歸調用)。
解決辦法:增加默認棧的容量。
棧容量 -Xss 默認1M

OutOfMemeoryError異常
原因:多線程環境下虛擬機在擴展棧時無法申請到足夠的內存空間。
解決辦法:減少默認棧的容量來換取更多的線程支持。

clipboard.png

JVM中線程共有的內存區域

Java堆
Java堆是被所有線程共享的一塊內存區域
所有的對象實例以及數組要在堆上分配

元數據區
老版本名稱:方法區(永久代)
類信息、常量、編譯後的代碼信息

直接內存

clipboard.png

以上源於一個視頻講解的概述總結,後續將分享後半部分的內容:

可達性分析算法——GC Roots
JVM中的堆
新生代爲什麼分三個區?
新生代對象的分配和回收
老年代對象的分配和回收
JVM中一次完整的GC流程是怎樣的?

**如果有興趣想了解視頻具體內容的可以關注我,加入我的合作羣(805685193)即可獲取原視頻。
還有一些Java架構視頻講解,需要獲取Dubbo、Redis、設計模式、Netty、zookeeper、Spring cloud、分佈式、高併發等架構技術視頻教程資料,架構思維導圖,和BATJ面試題及答案的,都是免費分享的。
關注我,加入我的合作羣(805685193)即可獲取視頻。**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章