垃圾回收
一個對象如果不再使用,需要手動釋放,否則就會出現內存泄漏。我們稱這種釋放對象的過程為垃圾回收,而需要程序員編寫代碼進行回收的方式為手動回收。
內存泄漏指的是不再使用的對象在系統中未被回收,內存泄漏的積累可能會導致內存溢出
java中為了簡化對象的釋放,引入了自動的垃圾回收(garbage collection簡稱GC)機制。通過垃圾回收器來對不再使用的對象完成自動的回收,垃圾回收器主要負責對堆上的內存進行回收。其他語言例如c#,python,go都擁有自己的垃圾回收器
定位垃圾的兩種方法
引用計數法
一個對象被引用了一次,在當前對象頭上遞增一次引用次數,如果這個對象的引用次數為0,代表這個對象可回收。
當對象間出現了循環引用的話,引用計數法會失效
可達性分析算法
掃描堆中的對象,看是否能夠沿著GC Root對象為起點的引用鏈找到該對象,找不到,表示可以回收
哪些對象可以作為GC Root?
虛擬機棧(棧幀中的本地變量表)中引用的對象
方法區中類靜態屬性引用的對象
方法區中常量引用的對象
本地方法棧中JNI(Native方法)引用的對象
垃圾清除算法
標記清除算法
標記和清除
1.根據可達性分析算法得出的垃圾進行標記
2.對這些標記為可回收的內容進行垃圾回收
優點:清理速度較快
缺點,碎片化嚴重,內存不連貫
標記整理算法
和標記清除算法前面都一致,但多了一步,對象移動內存位置使得內存連續
優點:不會有內存碎片
缺點:犧牲了性能和速度
復制算法
將內存空間一分為二,每次清除和回收時都將剩下的移動到另一端。
優點:在垃圾對象多的情況下,效率較高。清理后,內存無碎片
缺點:分配的兩塊內存空間,在同一時刻只能使用一般,內存使用率較低
分代收集算法
在java8時,堆被分為了兩份:新生代和老年代(1:2)
對于新生代,內部又被分為了三個區域:
eden區,新生的對象都分配到這里
survivor區:分著from和to
eden,from,to(8:1:1)
MinorGC,MixedGC,FullGC的區別是什么
MinorGC(youngGC)發生在新生代的垃圾回收,暫停時間短(STW)
MixedGC新生代+老年代部分區域的垃圾回收,G1收集器特有
FullGC新生代+老年代完整垃圾回收,展廳時間長(STW),應盡量避免
垃圾回收器
G1垃圾回收器機制
強引用,軟引用,弱引用,虛引用的區別
強引用:只有所有GCRoots對象都不通過強引用該對象,該對象才能被垃圾回收
軟引用:僅有軟引用引用該對象時,在垃圾回收后,內存如果仍然不足時會再次發出垃圾回收
弱引用:僅有弱引用引用該對象時,在垃圾回收時,無論內存是否充足,都會回收弱引用對象
虛引用:必須配合引用隊列使用,被引用對象回收時,會將虛引用入隊,由Reference Handler線程調用虛引用相關方法釋放直接內存