目錄
分代收集理論
三種垃圾回收算法
標記-清除算法(最基礎的、基本不用)
標記-復制算法
標記-整理算法
正式因為jvm有了垃圾回收機制,作為java開發者不會去特備關注內存,不像C和C++。
優點:開發門檻低、安全
缺點:性能問題。c和c++可以自己操控內存等,性能更高
垃圾回收學的是算法,垃圾回收有很多種算法,學完這個的目標一個是需要學習人家的思路,第二個是需要根據自己的業務特色去選用特定的垃圾回收算法
分代收集理論
建立在兩個假說之上:
????????弱分代假說(Weak Generational Hypothesis):絕大多數對象都是朝生夕滅的。
????????強分代假說(Strong Generational Hypothesis):熬過越多次垃圾收集過程的對象就越難以消亡。
原理:收集器應該將Java堆劃分出不同的區域,然后將回收對象依據其年齡(年齡即對象熬過垃圾收集過程的次數)分配到不同的區域之中存儲。根據不同區域采取不同的垃圾回收算法。至少將java堆分為兩部分:新生代和老年代。新生代中存朝生夕滅的對象,老年代中存熬過很多次垃圾回收。新生代熬過一次加一,到特定數值移到老年代中。
分代的好處:時間開銷、內存空間的有效利用
分代的弊端:如果新生代中的對象被老年代中引用,則在每次回收需要掃描所有老年代檢查飲用者是否是否存活,即跨界引用的問題。
分代弊端的解決方法:為了解決跨代引用,增加第三條法則:跨代引用相對同代引用更容易存活,很容易成為老年代對象,進而成為同代引用。同時為了不掃描整個老年代,老年代開辟出一塊空間,這塊空間只放跨代引用的對象
三種垃圾回收算法
標記-清除算法(最基礎的、基本不用)
????????原理:標記哪些對象存活那些死亡,然后清除死亡的
????????弊端:
? ? ? ? ? ? ? ? ①、效率問題:如果Java堆中包含大量對象,而且其中大部分是需要被回收的,這時必須進行大量標記和清除的動作,導致標記和清除兩個過程的執行效率都隨對象數量增長而降低
? ? ? ? ? ? ? ? ②、內存碎片問題:之后可能因為沒有足夠的空間放大文件而導致下一次的垃圾回收提前
標記-復制算法
????????原理:空間分為1:1,在用的時候用一半,垃圾清除的時候將所用一半中不需要清除的順序地放到另一半上。研究表明,百分之98的對象熬不過第一輪垃圾清除,所以不需要1:1。將jvm堆區域分為三份(80%、10%10%),每次新生代可用的內存空間為其中的兩份占90%,而將其中不需要清理的放到剩余的百分之十上面,再次使用時空間為80%和這百分之10
????????解決了效率問題和內存碎片的問題
標記-整理算法
????????產生原因:標記復制中對象存活率較高時需要進行較多的復制操作,效率低。
????????原理:先標記,將存活的對象移動到一端,然后設置邊界,另外一端全刪。解決了碎片化的問題,
? ? ? ? 弊端:如果每次回收有大量存活,移動和更新耗費大量資源。在標記的時候需要停下所有的應用程序,不然可能標記完之后再次更改空間大小,使得標記的數據不準確。內存的訪問是用戶程序中最頻繁的操作之一,假如宕機的話,會直接影響應用程序的運行
? ? ? ? 解決方法:在平時進行標記清除,碎片化程度影響內存分配時進行標記整理
????????注:通常標記-清除算法也是需要停頓用戶線程來標記、清理可回收對象的,只是停頓時間相對而言要來的短而已。
????????