1. JVM的位置 JVM是運行在操作系統之上的。 2. JVM體繫結構 3. 類載入器 類載入器的作用:載入class文件 載入器:①.ApplicationClassLoader應用程式類載入器,主要負責載入當前應用classpath路徑下的所有類; ②.ExtentionClassLoader ...
1. JVM的位置
JVM是運行在操作系統之上的。
2. JVM體繫結構
3. 類載入器
類載入器的作用:載入class文件
載入器:①.ApplicationClassLoader應用程式類載入器,主要負責載入當前應用classpath路徑下的所有類;
②.ExtentionClassLoader擴展類載入器,主要負責載入\lib\ext目錄下的jar包和class文件;
③.BootstrapClassLoader啟動類載入器,主要負責載入\lib下的tr、resources.jar、charset.jar和class等;
④.UserClassLoader用戶自定義類載入器,可載入指定路徑的class文件。
4. 雙親委派機制
類載入器收到類載入的請求,會將請求向上委托給父類載入器區完成,一直到BootstrapClassLoader啟動類載入器。
啟動類載入器收到載入類的請求會檢查這個類能否載入,能夠載入則完成。不能載入就拋出異常,通知子載入器進行載入。
5. 沙箱安全機制
①. Java安全模型的核心就是java沙箱(sandbox),什麼是沙箱?沙箱是限製程序訪問系統資源的環境。沙箱機制就是將java代碼
限定在JVM虛擬機特定的運行範圍中,並且嚴格限制代碼對本地資源(CPU、記憶體、文件系統、網路)的訪問,通過這樣的措施
來保證對代碼的有效隔離,防止對本地系統造成破壞。
②. 在java中將執行程式分為本地代碼和遠程代碼兩類,本地代碼預設是可信任的,而遠程代碼則被視為不受信任的。對於授信的
本地代碼來說,可以訪問一切系統資源。
6. native
凡是帶有native關鍵字的代碼,說明java代碼達不到了,需要調用底層c語言的庫。
本地方法庫的作用:擴展java的使用,融合不同的編程語言為Java所用!在java誕生的時候,c、c++橫行,
想要立足必須調用c、c++的程式,所以它在記憶體區域中專門開闢了一塊標記區域:Native Method Stack,
登記native方法。在最終執行的時候,載入本地方法庫中的方法。
7. 方法區
Method Area方法區:方法區是被所有線程共用,所有欄位和方法位元組碼,以及一些特殊方法,如構造函數,介面代碼
也在此定義。簡單說,所有定義的方法的信息都保存在該區域,該區域是屬於共用區間;靜態變數、常量、類信息(
構造方法、介面定義)、運行時的常量池存在方法區中,但是實例變數存在堆記憶體中,和方法區無關。
8. 棧
略
9.堆
一個JVM只有一個堆(Heap)記憶體,堆記憶體的大小是可以調節的。
類載入器讀取到類文件後,一般會把什麼東西放到堆中?類,方法,常量,變數,保存我們所有引用類型的真實對象。
堆記憶體中還可以細分為三個區域: 新生區(Eden、ServivorTo、ServivorFrom)、養老區(Old)、永久區(Perm)
GC垃圾回收,主要是在伊甸園區和養老區。
10. 新生區、永久區、堆記憶體調優
新生區: ①類誕生和成長的地方,甚至死去。
②伊甸園,所有的對象都是在伊甸園區new出來的
③幸存者區
真理: 經過研究發現,99%的對象都是臨時對象!
永久區: 這個區域存儲的是java運行時的一些環境或類信息,這個區域不存在垃圾回收,關閉JVM虛擬機就會釋放這個區域的記憶體。
GC分為兩類: ①輕GC(針對新生代,偶爾針對下幸存區) ②重GC(全局GC,所有東西都釋放一遍,釋放記憶體)
11. 使用Jprofiler工具分析OOM原因
Jprofiler作用: 分析Dump記憶體文件,快速定位記憶體泄漏;獲得堆中的數據;獲得大的對象
-Xms 設置初始化記憶體分配大小(預設為1/64)
-Xmx 設置最大分配記憶體(預設1/4)