一:java的垃圾回收機制,總題來說分2種:
一種引用計數算法,一種跟搜索算法。
引用計數的算法,有個bug:2個相互引用的對象,引用的計數一直是1,永遠不會被回收。
跟搜索算法:選定一些對象作爲跟對象,組成GC rootset的集合,從跟對象開始,查找所有的能關聯到的對象。
連接可達的對象,就是有引用的,不能回收。
連接不可達的對象,就是沒有被引用到的,就是需要被回收的對象。
二:這裏有2個問題點:
1、哪些對象可以用來做跟對象?
2、是不是 不可達的對象,就立即被回收了?
問題1回答:
1、虛擬機棧(棧幀中的本地變量表)中引用的對象。
2、 本地方法棧中JNI(即一般說的native方法)引用的對象。
3、 方法區中的靜態變量和常量引用的對象。
問題2回答:
java對象的生命週期:
1、創建階段:create
2、使用階段
3、不可見階段
4、不可達階段
5、執行finalize
6、被回收
三:GC在什麼時候執行?
GC機制將對內存分爲年輕代,老年代,持久代。
年輕代又分爲3部分:Eden,s_from,s_to。
新分配的對象都進入年輕代的Eden,特別大的對象,直接進老年代。
gc在2種情況是進行:
1、Eden滿了,minor gc;
2、老年代滿了,full gc。