您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關關于JVM的基礎知識有什么呢,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
虛擬機給人的感覺像是操作系統、編譯器:非常高大上。但是Java程序就跑在上面,遇到問題還得去排查,性能不行還得去優化,基礎的知識還是需要的!
內存管理
Java虛擬機在執行的過程中會把它所管理的內存劃分為若干個不同的數據區域,大致如下:
各部分的功能如下:
在內存管理部分比較大的一塊內容是GC(垃圾回收),所謂垃圾回收就是將垃圾占用的內存回收掉。那么第一個問題:什么是垃圾?
引用計數算法:被引用次數為0的對象。
根搜索算法:從GC Roots沿著引用找不到的對象。
這里都提到了引用,在JDK 1.2之后Java就已經對引用的概念進行了擴充,那么第二個問題:有哪些類型的引用?
強引用:Object o = new Object()這種都是強引用。
弱引用:還有用但非必須的,在OOM之前被回收。
軟引用:更弱的引用,在下次GC的時候被回收。
虛引用:最弱的,唯一的作用是在對象被回收的時候可以收到通知。
這里只有強引用才能對對象的生命周期造成影響。在虛擬機發展的過程中進化出不少垃圾回收算法,比如:
標記-清除算法
復制算法
標記-整理算法
分代收集算法
在實際中用到的回收器都是這幾種算法的組合,比如從VisualVM中看到的內存是這樣的(需要明白各部分都是怎樣互相配合的):
整體上來看是分代收集算法,而S0、S1這兩部分可以看做是標記-整理算法。那么第三個問題:常見的CMS垃圾回收器的執行流程是怎樣的?
初始標記:GC Roots直接關聯的對象。
并發標記:Root Tracing。
重新標記:修復由于程序運行導致標記產生變動。
并發清除
具體如下圖所示:
可以看到只有在初始標記和重新標記的時候才需要Stop The World,其他都是和用戶線程一起執行,不要以為這就完美了,并行執行的過程會消耗掉一些CPU資源。
代碼執行
把Java源碼丟給JVM肯定是不能執行的,需要先用javac編譯成class文件才行,那么第一個問題:class文件的結構是怎樣的?
常量池
訪問標志
類索引、父類索引和接口索引
字段表
方法表
屬性表
虛擬機規范并沒有規定在什么時候要加載類,但是規定了在遇到new、反射、父類、Main的時候需要初始化完成。整個類的生命周期如下:
在虛擬機中通過ClassLoader來進行類的加載,這地方需要明白:
兩個類是否相同,除了類名外還需要判斷ClassLoader是否相同。
雙親委派模式并不是一個強制約束。
在類加載完成之后就可以開始執行了,和線程運轉相關的東西都放在棧幀中,其結構如下:
執行中具體調用哪個方法是個頭疼的問題,需要處理:
靜態分派:相同名稱、不同參數類型的方法。
動態分派:繼承中復寫的方法。
字節碼中的指令都是基于棧的操作,比如要完成1+1這樣的計算,對應的指令如下:
iconst_1 // 將常量1壓入棧iconst_1iadd // 把棧頂的兩個值相加并出棧,然后把結果放回棧istore_0 // 將棧頂的值放到局部變量表第0個Solt
解釋執行的好處是下載后啟動速度快,但是確定也非常明顯:運行速度慢。JIT正是用來解決這個問題的,能夠將多次調用的方法、多次執行的循環體編譯成本地代碼。
優化是個很好玩的題目,記得在參加一次變成比賽的時候用gcc -O3編譯之后的代碼把printf()都沒輸出了。。在JIT中比較常見的優化手段有:
程序執行一定會涉及到內存操作,在Java中定義了八種操作來完成:
這里有必要講一下volatile的作用,在使用到的時候能明白下面兩條即可:
保證變量對所有線程是可見的。
禁止指令重排優化。
如果Java中所有的操作都需要程序員來控制的話,會有大量的重復代碼,而且寫起來很累,那么我們可以通過先行發生原則來判斷并行的兩個操作是否存在沖突:
程序次序規則:單線程內按照程序書寫順序。
管程鎖定規則:unlock必須在lock之前。
volatile變量規則:寫操作先行發生于讀操作。
線程啟動規則:Thread.start()先于線程的其他任意方法。
線程終止規則:線程中所有的操作都先于對此線程的終止檢測。
線程中斷規則:interrupt()先于中斷檢測。
對象終結規則:對象的初始化完成先于它的finalize()方法。
傳遞規則:如果A先于B、B先于C,那么A先于C。
Thread的底層實現還是比較麻煩的,但是最起碼應該知道Thread的狀態是如何進行轉換:
最后,常見的同步方式是synchronized或者aqs的各種實現。
上述就是小編為大家分享的關于JVM的基礎知識有什么呢了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。