马士兵JVM课程笔记
馬士兵JVM課程筆記
GC和GC Tuning
GC的基礎(chǔ)知識
1.什么是垃圾
C語言申請內(nèi)存:malloc free
C++: new delete
c/C++ 手動回收內(nèi)存
Java: new ?
自動內(nèi)存回收,編程上簡單,系統(tǒng)不容易出錯,手動釋放內(nèi)存,容易出兩種類型的問題:
沒有任何引用指向的一個對象或者多個對象(循環(huán)引用)
2.如何定位垃圾
3.常見的垃圾回收算法
1.標記清除(Mark-Sweep)
老年代一般是由標記清除或者是標記清除與標記整理的混合實現(xiàn)
- 原理
當堆中的有效內(nèi)存空間(available memory)被耗盡的時候,就會停止整個程序(也被稱為stop the world),然后進行兩項工作,第一項則是標記,第二項則是清除。
標記:從引用根節(jié)點開始標記所有被引用的對象。標記的過程其實就是遍歷所有的GC Roots,然后將所有GC Roots可達的對象 標記為存活的對象。
清除:遍歷整個堆,把未標記的對象清除。
缺點:此算法需要暫停整個應(yīng)用,會產(chǎn)生內(nèi)存碎片
用通俗的話解釋一下標記/清除算法,就是當程序運行期間,若可以使用的內(nèi)存被耗盡的時候,GC線程就會被觸發(fā)并將程序暫停,隨后將依舊存活的對象標記一遍,最終再將堆中所有沒被標記的對象全部清除掉,接下來便讓程序恢復運行。
- 劣勢
1、首先,它的缺點就是效率比較低(遞歸與全堆對象遍歷),而且在進行GC的時候,需要停止應(yīng)用程序,這會導致用戶體驗非常差勁
2、其次,主要的缺點則是這種方式清理出來的空閑內(nèi)存是不連續(xù)的,這點不難理解,我們的死亡對象都是隨即的出現(xiàn)在內(nèi)存的各個角落的,現(xiàn)在把它們清除之后,內(nèi)存的布局自然會亂七八糟。而為了應(yīng)付這一點,JVM就不得不維持一個內(nèi)存的空閑列表,這又是一種開銷。而且在分配數(shù)組對象的時候,尋找連續(xù)的內(nèi)存空間會不太好找。
總結(jié)
以上是生活随笔為你收集整理的马士兵JVM课程笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java canvas类画直线_canv
- 下一篇: 软件测试——逻辑覆盖