類加載機制 https://blog.csdn.net/xu768840497/article/details/79175335
類的生命週期
1、加載:讀取二進制內容
2、驗證:已驗證class文件格式規範、語義分析、引用驗證、字節碼驗證
3、準備:分配內存、設置類static修飾的變量初始值
4、解析:類、接口、字段、類方法等解析
5、初始化:爲靜態變量賦值;執行靜態代碼塊
6、創建實例對象
7、從JVM方法區中卸載
類加載器
1、Bootstrap loader:核心類庫加載器,C/C++實現,無對應java類:null加載JRE_HOME/jre/lib目錄,或者用戶配置的目錄 JDK核心類庫rt.jar
2、Extension Class Loader:擴展類庫加載器,ExtClassLoader實例:加載JRE_HOME/jre/lib/ext目錄,JDK拓展包,或者用戶配置的目錄
3、application clas loader:用戶應用程序加載器,AppClassLoader.path制定的目錄,用戶應用程序class-path 或者java命令運行時參數-cp..
1、啓動類加載器(Bootstrap ClassLoader),它是屬於虛擬機自身的一部分,用C++實現的,主要負責加載
<JAVA_HOME>\lib目錄中或被-Xbootclasspath指定的路徑中的並且文件名是被虛擬機識別的文件。它
等於是所有類加載器的爸爸。
2、擴展類加載器(Extension ClassLoader),它是Java實現的,獨立於虛擬機,主要負責加載<JAVA_HOME>\lib\ext目錄中或
被java.ext.dirs系統變量所指定的路徑的類庫。
3、應用程序類加載器(Application ClassLoader),它是Java實現的,獨立於虛擬機。主要負責加載用戶類路徑(classPath)上
的類庫,如果我們沒有實現自定義的類加載器那這玩意就是我們程序中的默認加載器。
查看類對應的加載器:
API:java.lang.Class.getClassLoader()
如果這個類是有bootstrapClassLoader加載的,那麼這個方法在這種實現中將返回null
類的卸載
滿足兩個條件時會被卸載
1、該Class所有的實例都已被GC
2、加載該類的ClassLoader實例已被GC
驗證方式:JVM啓動中增加-verbose:class參數,輸出類加載和卸載的日誌信息
雙親委派模型
爲例避免重複加載,由下到上逐級委託,由上到下逐級查找。
通一個類加載器不會加載多同一個類,判斷方式ID+類名。
熱部署:使用不同的類加載器加載改變之後的Class文件
垃圾收集
自動垃圾收集
自動垃圾收集是查看堆內存,識別正在使用哪些對象以及哪些對象未被刪除以及刪除未使用對象的過程。
使用中的對象或引用的對象意味着程序的某些部分任然尾喉指向該對象的指針。
程序的任何部分都不在引用爲啥使用的對象或未引用的對象,因此可以回收未引用對象使用的內存。
在c這樣的編程語言中,分配和釋放內存是一個手動的過程,在Java中,,接觸分配內存的過程是由垃圾收集器自動處理
如何確定內存需要被回收
該過程的第一步稱爲標記。這是垃圾收集器識別哪些內存真正在使用而哪些不在使用的地方
可達性分析算法
將對象及其引用關係看做一個圖,選定一個活動的對象做爲GC Roots。然後跟蹤引用鏈條,如果一個對象和GC Roots之間不可達,也就是不存在引用,
那麼即可認爲是可回收的對象
可作爲GC Root的對象
1、虛擬機棧中正在引用的對象
2、本地方法棧中正在引用的對象
3、靜態屬性引用的對象
4、方法區常亮引用的對象
引用類型:
強引用(StrongReference):最常見的普通對象引用,只要還有強引用指向一個對象,就不會被回收
軟引用(SoftReference):JVM認爲內存不足時,纔會試圖回收軟引用指向的對象。(緩存場景)
弱引用(WeakReference):雖然是引用,但是隨時可能被回收掉
虛引用(PhantomReference):不能通過它訪問的對象。對象被finalize以後,執行指定 邏輯的機制(Cleaner)
可達性級別:
強可達(Strongly Reachable)一個對象可以有一個或多個線程可以不通過各種引用訪問到的情況
軟可達(Softly Reachable):當只能通過軟引用才能訪問到對象的狀態
弱可達(Weakly Reachable):只能通過弱引用訪問時的狀態。當弱引用被清除的時候,就符合銷燬條件
幻想可達(Phantom Reachable):不存在其他引用,並且finalize過了,只有幻想引用指向這個對象,
不可達(unreachaable):意味着對象可以被清除了
調優基本概念
在調整性能時,JVM有三個組件
1、堆大小調整
2、垃圾收集器調整
3、JIT編譯器
大多數調優選項都與調整堆大小和爲您的情況選擇最合適的垃圾收集器有關。
JIT編譯器對性能也有很大影響,但很少需要使用教新版本的JVM進行調優。
通常在調優Java應用時。重點是一下兩個主要目標之一
響應性:應用程序或操作系統對請求的數據進行相應的數據,對於專注於相應性的應用程序,長的暫停時間
是不可接受的,重點是在短時間內做出迴應
吞吐量:側重於在特定的時間段內最大化應用程序的工作量,對於專注於吞吐量的應用程序,高暫停時間是
可以忍受的。由於高吞吐應用程序在較長時間內專注於基準測試,因此不需要考慮快速響應時間
GC調優思路:
1、分析場景
啓動速度慢;偶爾出現相應慢於平均水平或者出現卡頓
2、確定目標
內存佔用、低延時、吞吐量
3、收集日誌
通過配置參數配置手機GC日誌;通過JDK工具查看GC狀態
4、分析日誌
使用工具輔助分析日誌,查看GC次數,GC時間
5、調整參數
切換垃圾收集器或者調整垃圾收集器參數
垃圾收集算法
標記-清除
複製算法
標記整理算法
垃圾收集算法:
老年代分帶收集算法:
引用類型和可達性級別:
可達性分析算法:
垃圾收集器(併發收集,CMS):
垃圾收集器(併發收集器G1):
垃圾收集器(並行,多線程):
垃圾收集器(並行收集器、已放棄維護):
垃圾收集器(串行,單線程):
垃圾收集器組合(完整圖):
JVM幾個常見內置命令:
JAVA內置工具-Jconsole:
JAVA內置命令-javap:
JAVA內置命令-jcmd:
JAVA內置命令jhat:
JAVA內置命令-jinfo:
JAVA內置命令-jmap:
JAVA內置命令-JPS:
JAVA內置命令-jstack:
JAVA內置命令-jstat被jcmd命令替代:
JDK內置工具-JvisualVM: