一、java垃圾回收的古老的一個算法是引用計數法,也就是說一個對象被引用一次就計數一次,回收時若是一個對象的計數爲0也就是沒有引用了就進行回收。java
二、還有一種方法是標記-整理的方法,在堆上的根節點開始標記全部被引用的對象,第二階段就是遍歷整個堆,清除未標記的對象而且把有標記的進行壓縮到一塊兒,這樣就避免了坑坑窪窪有碎片。算法
三、程序是在棧上執行的,一個線程對應一個本身的線程棧,多線程會有多個棧。多線程
四、垃圾回收的起點是一些根對象,如java棧、靜態常量、寄存器。最簡單的java棧就是main函數,這種垃圾回收的方法就是上面提到的標記-清除的方法。socket
五、分代垃圾回收機制:爲何要分代?由於堆上的對象會有不少種類,有的好比說http鏈接socket鏈接等對象保持的時間相對較長,而每次去遍歷對象時對他們來講幾乎是沒有效果的,而一些相似String這樣的對象整個程序下來回產生不少。因此利用分治的思想,把不一樣生命週期的對象放在不一樣的代上來管理。虛擬機種共劃分了三個代:年輕代、年老代和持久代。其中持久代主要存放的就是java類的信息,這個與垃圾回收的java對象關係不大。年輕代和年老代的劃分是對垃圾回收影響比較大的。全部新生成的對象首先放在年輕代。在年輕代中n次垃圾回收後還保持存活的對象會被放入年老代。函數
六、什麼狀況下會觸發垃圾回收?GC分爲兩種,Scavenge GC和Full GC,通常狀況當新對象生成時就會觸發ScavengeGC,Full GC是對整個三個代進行回收,當年輕代年老代和持久代出現了被寫滿的狀況時就會觸發FullGC。固然手動調用System.gc()時也會調用FullGC。線程