1.如何判斷你是垃圾:
1)引用計數法
原理:每個對象都維護着一個引用計數器,沒被引用一次就加1,引用的地方置爲null就減去1,垃圾回收器掃描一個包含所有對象的列表,如果計數器爲0那就回收內存。
缺點:循環引用 不能回收廢棄的對象。
2)引用鏈法
每個heap中的對象都必須要能找對對象的源頭,G.Root對象的引用鏈,如果該對象沒有到Root對象的引用鏈就說明沒有引用,垃圾回收。
finalize方法是每個對象在被垃圾回收前會執行一次的方法,判斷是否直接被回收取決於這個方法了。
類回收:滿足下面三個條件,對這個類進行回收(類的加載以及初始化可以看看)
1)該類的實例都回收
2)加載該類的classloader回收了
3)沒有使用java.lang.Class的地方用到這個類,即沒有地方通過反射來使用這個類的
通過配置jvm參數來設置類回收策略。如-Xnoclassgc
2.回收的策略
1)標記-清理(mark-swap) 標記回收的內存塊,並執行回收。造成了零散的內存區域,不連續。
2)複製算法 內存分爲兩塊,用一般回收的時候將不回收的複製到另一塊,把另一塊清空。
3)標記-整理
將有用的標記出來,並將他們移動到內存的一端,將存活區邊界以外的全部內存區域清空。
4)分代收集
3.垃圾回收器
G1垃圾回收器,
分享一篇講得較好的博文,當然還是推薦看官方文檔。
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvm oracle官方jvm文檔
重點劃出有待明天整理。