目錄
java編譯相關知識
Java文件編譯過程
java的可跨平臺性
JVM內存結構
運行期數據區域(JDK8之后)
本地方法棧
虛擬方法棧
程序計數器
堆
本地內存
棧幀里面的局部變量表和方法區(元空間的區別)
類加載器
啟動類加載器
拓展類加載器
系統類加載器
自定義類加載器
垃圾回收器
執行引擎
本地方法接口
java編譯相關知識
Java文件編譯過程
? ? ? ? 大家都知道計算機只知道0100101010101這種二進制,那么我們的代碼是怎么運行的呢??當然和編譯有關,當我們寫完aaa.java文件之后,我們需要通過javac來進行編譯,編譯成.class文件。因為JVM只認識.class文件。
java的可跨平臺性
? ? ? ? 大家都知道java有一個很強大的功能就是可跨平臺性,那大家有沒有想過可跨平臺性是如何做到的呢? 這就和JVM有關了。
? ? ? ??JVM 是一個虛擬的計算機,它在運行時將字節碼轉換為特定平臺的機器碼。JVM 的存在使得 Java 程序可以在不同的操作系統和硬件平臺上運行,而無需重新編譯。
JVM內存結構
運行期數據區域(JDK8之后)
本地方法棧
? ? ? ? 主要用于執行native方法(java之外的,如C++編寫的方法)的,本地方法會創建棧幀(由局部變量表,操作棧幀,動態鏈接,發方法出口),會出現?StackOverflowError 和 OutOfMemoryError 兩種錯誤。
虛擬方法棧
? ? ? ? 主要用于執行java方法的,和本地方法棧類似由 Java 虛擬機(JVM)直接執行的方法。它們在 Java 源代碼中定義,并在編譯后轉換為字節碼,存儲在 .class
文件中。
程序計數器
? ? ? ? 主要用于存儲當前現在線程正在執行的java方法的JVM指令地址,如果是本地方法,則為NULL,這個區域不會出現oom問題。
堆
?????????堆被所有線程共享,主要存儲對象實例,在虛擬機啟動時候創建,堆分新生代和老年代,新生代里面還有Eden、S0、S1。如果在堆中沒有內存完成實例分配,并且堆也無法擴展時會拋出 OutOfMemoryError 異常。
本地內存
? ? ? ? 本地內存里面主要方法區,在jdk1.8之后,元空間替代了永久代,方法與主要存放類的信息,變量,常量等數據。內存不足時會拋出 OutOfMemoryError 異常。
棧幀里面的局部變量表和方法區(元空間的區別)
? ? ? ? 棧幀里面的局部變量表存放的方法被調用時的參數,而方法區存放的類的信息。
類加載器
?????????類加載器(ClassLoader)主要的作用是將.Class文件加載的JVM中。
啟動類加載器
?????????這是最高級別的類加載器,是由C++實現的,啟動類加載器無法被Java程序直接引用。
拓展類加載器
????????它是Java語言實現的,繼承自ClassLoader類,負責加載Java擴展目錄(jre/lib/ext或由系統變量Java.ext.dirs指定的目錄)下的jar包和類庫。擴展類加載器由啟動類加載器加載,并且父加載器就是啟動類加載器。
系統類加載器
? ? ? ? 系統類加載器主要是java語言的
-
環境變量
CLASSPATH
指定的路徑下的類和資源文件。 -
命令行參數
-classpath
或簡寫-cp
指定的路徑下的類和資源文件。 -
系統屬性
java.class.path
指定的路徑下的類和資源文件。
自定義類加載器
? ? ? ? 由開發者自定義的類。
垃圾回收器
????????垃圾回收(Garbage Collection, GC)是自動管理內存的一種機制,它負責自動釋放不再被程序引用的對象所占用的內存,這種機制減少了內存泄漏和內存管理錯誤的可能性。
執行引擎
負責執行 Java 字節碼,管理內存和多線程,以及與垃圾回收器協同工作。
本地方法接口
提供了與本地代碼交互的能力,允許 Java 程序訪問底層系統資源和遺留系統。
本文很多沒有展開詳細的說,只是將JVM內存結構闡述一下。本文資源來自于網絡,如有侵權聯系刪除。