1、垃圾回收的意義:算法
在Java中,當沒有對象引用指向原先分配給某個對象時,該內存便成爲垃圾。實際上,除了釋放沒用的對象,垃圾回收也能夠清除內存記錄碎片。垃圾回收能自動的釋放內存空間,減輕編程的負擔,這Java虛擬機具備一些優勢,首先,它能使編程效率提升。在沒有回收機制的視乎,可能要花費許多時間來解決一個難懂的存儲問題。在Java編程中,靠垃圾回收機制可大大縮短期,其次是它保存程序的完整性,垃圾回收是Java語言安全策略的重要部分。數據庫
2、如何肯定一個對象是否能夠被收回?編程
1.引用計數算法安全
是經過判斷對象的引用數量來決定對象是否能夠被回收。網絡
2.可達性分析算法:數據結構
是經過判斷對象的引用鏈是否可達來決定對象是否能夠被回收。對象
3、垃圾收集算法blog
1.標記清除算法:生命週期
標記-清除算法分析和清除兩個階段。該算法首先從根集合進行掃描,對存活的對象標記,標記完畢後,再掃描整個空間中未被標記的對象並進行回收。內存
2.複製算法
複製算法將可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊,當這一塊的內存用完了,就將還存活的對象複製到另一塊上面,而後再把已使用過的空間一次清理掉。
3.標記整理算法
標記整理算法的標記過程相似標記清除算法,但後續步驟不是直接對可回收對象進行清理,而是讓全部存活的對象都想一端移動,而後直接清理掉端邊界之外的內存,相似於磁盤整理過程,該垃圾回收算法使用與對象存活率高的場景。
4.分代收集算法
不一樣的對象的生命週期是不同的,而不一樣生命週期的對象位於堆中不一樣的區域,所以對堆內存不一樣的區域採用不一樣的策略進行回收能夠提升JVM的執行效率。
a.新生代:新生代的目標是儘量快速的收集掉那些生命週期短的對象,通常狀況,全部新生成的對象首先是放在新生代的。在垃圾回收時,先將eden區存活對象複製到survivor0區,而後清空eden區,當這個survivor0也滿了時,則將eden區和survivor0區存活對象複製到survivor1中,而後清空eden和這個survivor0,此時survivor0區是空的,而後交換survivor0和survivor1區的角色,即保存survivor0區空,如此往復,
b.老年代:老年代存放的都是一些生命週期較長的對象,就像上面敘述的那樣,在新生代中經歷了N次垃圾回收後任然存活的對象就會別放到老年代中。
c.永久代:永久代主要用於存放靜態文件,如Java類,方法等
5.總結
4、垃圾收集器
若是說垃圾收集算法是內存回收算法的方法論,那麼垃圾收集器就是內存回收的具體實現,有7種做用不一樣的分代的收集器,其中用於回收新生代的收集器包括Serial、PraNew、Parallel Seavenge,回收老年代的收集器包括Serial Old、Parallel Old、CMS,還有用於回收整個Java堆的GI收集器,不一樣收集器之間的連線表示它們能夠搭配使用的。(還有一些細節,等下次用空補上)
5、內存分配與回收策略
1.對象優先在Eden分配,但Eden區沒有足夠空間進行分配時,虛擬機將發起一次MinorGC
2.大對象直接進入老年代
3.長期存活的對象講進入老年代
4.動態對象年齡的斷定
6、Java的內存泄漏問題:
內存泄漏是指該內存空間使用完畢以後未回收,在不涉及複雜數據結構的通常狀況寫,Java的內存泄漏表現爲一個內存對象的生命週期超出了程序須要它的長度。
1.HashMap、Vector等集合的靜態使用最容易出現內存泄漏問題,
2.各類資源鏈接包括數據庫鏈接、網絡鏈接、IO鏈接等沒有顯示調用close關閉,不被GC回收致使內存泄漏
3.監聽器的使用,在釋放對象的同時沒有相應刪除監聽器的時候也可能致使內存泄漏。
7、知識點的補充
1.方法區的回收
方法區的內存回收目標主要針對常量池的回收和對類型的卸載。