JVM的位置
JVM的體系結構
- 程序計數器即PC寄存器
類加載器及雙親委派機制
- 作用:加載class文件。
- 級別:
- 1、虛擬機自帶的加載器
- 2、啓動類(根)加載器(rt-jar)
- 3、擴展類加載器(jre目錄下–lib–ext)
- 4、應用程序加載器(AppClassLoader)
- 雙親委派機制
- 1、類加載器收到類加載的請求
- 2、先將這個請求向上委託給父類加載器去完成,一直向上委託,直到根加載器
- 3、啓動類加載器檢查是否能夠加載當前類,能加載就結束,使用當前加載器,否則,拋出異常,通知子加載器進行加載
- 4、重複步驟3
- 注意:往上調用會遇到null,代表java調用不到,底層是用C/C++來寫的;
- native關鍵字:修飾方法即爲本地方法,代碼構成爲C/C++(例如線程相關方法,java處理不了線程,用C/C++進行方法編寫,用native關鍵字修飾。)
- java爲什麼叫C++ --:對C++語言中指針、內存管理進行升級優化而來。
沙箱安全機制
- 安全管理、權限控制
native、方法區
- 凡是帶了native關鍵字的,說明java的作用範圍達不到了,會去調用底層C語言的庫。
- 會進入本地方法棧,登記native方法。
- 真正執行的時候,通過本地方法接口(JNI)執行。
- 產生原因:java誕生之初C/C++橫行,想要立足,必須要有調用C/C++的程序。
- 作用:擴展Java的使用,融合不同的編程語言爲java使用。以及操作硬件。
- 例如java程序驅動打印機,管理系統,native在企業開發中較爲少見。
- 方法區存放:static(靜態變量)、final(常量)、Class(類信息)、常量池
棧
- 本質是:數據結構;
- 程序=算法+數據結構;(非框架+業務邏輯)
- 棧:先進後出,後進先出;隊列:先進先出(FIFO),喝多了吐就是棧,吃多了拉就是隊列。
- 棧內存主管程序的運行,生命週期和線程同步。線程結束,棧內存也即釋放,對於棧來說,不存在垃圾回收的問題,一旦線程結束,棧也就結束了。
- 棧內存放:8大基本類型+對象引用+實例的方法。
堆
- Heap:一個JVM只有一個堆內存,堆內存的大小是可以調節的。
元空間:邏輯上存在,物理上不存在。
使用JProfiler工具分析OOM原因
GC算法
- 引用計數法
- 複製算法
- 好處:沒有內存碎片
- 壞處:浪費部分內存空間,to區永遠爲空;
- 最佳使用場景:對象存活度較低的區域。
- 標記清除算法
- 標記壓縮算法
- 總結:
- 內存效率:複製算法>標記清除算法>標記壓縮算法
- 內存整齊度:複製算法= 標記壓縮算法 > 標記清除算法
- 內存利用率:標記壓縮算法>標記清除算法>複製算法
- GC分代收集算法:
- 年輕代(存活率低):複製算法
- 老年代(區域大,存活率高):標記清除+標記壓縮混合實現
JMM
- JAVA Memory Model(JAVA內存模型)
- 作用:jvm對應於物理機,jmm對應於緩存一致性協議,用於定義數據讀寫的規則。