學習筆記 2021.10.25
2021.10.25
JVM
垃圾回收相關概念
system.gc的理解
- 當然回收的區域也包括方法區。
- 免責宣告的意思是不保證什麼時候執行,即該方法的作用是提醒虛擬機器希望執行垃圾回收行為。
- 該方法與system.runfinalizationg方法後即會強制呼叫finalize方法,即可理解成強制執行了垃圾回收。
有兩個例子理解下:
一個是上面3和4的區別,3沒有進行回收,而4進行了回收,可以理解成3和4中的區域性程式碼塊執行了過後區域性變數在區域性變量表中還存在著引用,只是沒有顯示。只有在外面再新增區域性變數對其引用進行覆蓋後才會使物件的引用消除。
這個的解釋即是某個方法中建立了引用和物件,但在方法執行完棧幀彈出後引用即沒有了,從而再呼叫一次垃圾回收能夠達到效果。
記憶體溢位
java中對oom的解釋是:沒有空閒記憶體,並且垃圾收集器也無法提供更多的記憶體。
一般來說,記憶體沒有空閒記憶體的情況,一般指java虛擬機器的記憶體不夠,原因有以下兩種:
然後就是針對記憶體溢位,垃圾收集器在特定的場景下也有一些針對性的操作:
記憶體洩露
嚴格來說:只有物件不會再被程式用到,但是GC又不能回收他們的情況,才叫記憶體洩漏。
- 寬泛意義上的即是比如說Static定義的,如果不好好處理的話,會隨著類的載入而建立,從而導致生命週期很長。
一些很常見的例子
- 即外部的資源都最好要手動去回收。
stop the world理解
- 作用就是防止在判斷的時候具體情況又發生變化。
- 這個操作是一定會發生的。
- 儘管再好的垃圾回收器,都是無法避免的,只能說GC越來越優秀,回收效率越來越高,儘可能的縮短了時間。
- 是在後臺自動發起和自動完成的。
- 呼叫system.gc也會導致stw的發生。
程式的並行與併發
併發的概念
並不是並行!!每個時間段都是隻有一個程式在進行的。
並行的概念:
二者對比
- 併發是多個事情在同一時間段上同時發生了,並行是指多個事情在同一時間點上同時發生了。
- 併發是要搶資源的,但是並行不會。
垃圾回收的併發與並行
具體的圖示上面已經解釋夠清楚了。
垃圾回收的併發
安全點與安全區域
安全點:
簡單理解即是能夠發生stw進行垃圾回收的點。
執行緒跑到完全點停頓下來的時機的選擇
安全區域:
用於針對無法響應的執行緒如何實現垃圾回收的設計,使得在該區域中任何位置都能開始GC
具體執行的細節:
再談引用
具體引入各種引用的出發點:
大概的引用強度是按照強軟弱虛這麼一個順序來排列的。
具體四種引用型別的概述:
- 軟引用:記憶體不足才回收。
- 強引用:就算系統報oom也不會收,且容易導致記憶體洩露。
- 弱引用:不管記憶體夠不夠,都回收。發現即回收。
- 虛引用:主要關注其上面寫的唯一目的。
強引用
即是平時最常見的引用關係,基本的概念其實在前面學習的過程中也是慢慢熟悉了的,基本就是做個總結即可。
軟引用
基本瞭解個概念就可以了
- 換個角度理解,軟引用不會導致oom。
- 在記憶體足夠時不會去回收軟引用。
- 具體的建立和程式碼層面的實現有需求再細看,視訊裡面有舉例。
弱引用
同樣瞭解個概念即可:
虛引用(物件回收跟蹤)
- 更多的是通知和記錄的作用,具體的追蹤的實現,有配套的方法,具體用到的時候再去詳細瞭解。
插一個對不同版本的考慮
垃圾回收器
GC的分類
- 按執行緒數分:可分為序列和並行垃圾回收器。
- 按照工作模式分為:併發式和獨佔垃圾回收器
其他的分類方法:
評估效能指標
- 重點關注其中標紅色的。
- 基本的想法是吞吐量越大越好。
- 收集頻率根據實際情況而定,各自有優缺點
- 其中標紅的三點稱為不可能三角,即不可能同時滿足的指標,優秀的GC最多滿足其中兩項,其中暫停時間是最優先考慮的。
- 如果只考慮兩點,則是吞吐量和暫停時間。
吞吐量和暫停時間
簡單理解,即是兩個指標是完全矛盾的
現在注重的指標設計:在最大吞吐量優先的情況下,降低停頓時間。
常見的垃圾回收器有哪些
開頭:JVM有不同版本,對應著JVM搭配的GC的話,自然也有著不同型別的GC。再展開。
七款經典的垃圾回收器:
後面的章節具體解釋。
垃圾回收器的組合關係
即對於堆中不同區域的垃圾回收的分工:
具體的組合關係的聯絡:
- csm和msc的線意思是可以作為後被方案,後面會詳細說。
- 紅線是JDK8之後逐漸取消的組合。綠線也是。
- 包括CMS這種GC也是remove了的。
JAVA採取這麼多的GC,是因為使用場景很多,針對不同的場景,就是要採取不同的垃圾收集器。
選擇的永遠是對於具體應用最適合的垃圾收集器。
培養的即是選擇適合的垃圾回收器的能力。
還有教怎麼檢視預設的垃圾回收器,有些興趣可以去了解下。
Serial回收器
概述:
- 複製演算法! 序列回收! STW! 作為關鍵點記住。
- Serial old STW! 標記壓縮演算法! 也是要結合前面記住的。
基本的執行示例:
單執行緒還有層意思即是執行時必須停止所有其他的程序。
相關的優缺點:
缺點也是很明顯的,在互動較強的應用中,這是完全沒法接受的,僅在限定單核的情況下會使用他。
Parnew垃圾回收器
- 除了並行的區別外,與前面的Serial基本沒有區別。包括複製演算法等等。
- 由於並行的原因,可以知道stw的時間是相對更短的。
- 此時可以看到其合理性,對於新生代,回收次數頻繁,使用並行的方式更高效,老年代不是那麼頻繁,用序列可以節約資源。
- 自然的,也可以設定並行性的執行緒數量,最好數量小於cpu核的數量。
與Serial垃圾收集器的比較