今天看到一個gc面試題,覺得挺有意思的,寫下來,給自己留個印象
GC是在什么時候,對什么東西,做了什么事情?
1、什么時候
a、系統空閑的時候
b、系統自身決定,不可預測的時候調用gc
c、eden區滿了調用minor gc(),升級到老年代的對象大於老年代剩余空間調用full gc()
d、程序員不能具體控制時間,系統在不可預測的時間調用System.gc()函數的時候;當然可以通過調優,用NewRatio控制newObject和oldObject的比例,用MaxTenuringThreshold 控制進入oldObject的次數,使得oldObject 存儲空間延遲達到full gc,從而使得計時器引發gc時間延遲OOM的時間延遲,以延長對象生存期。
2、對什么東西
a、不使用的對象
b、超出作用域的對象,計步器為空的對象
c、從gc root開始搜索,搜不到的對象
d、超出了作用域或引用計數為空的對象;從gc root開始搜索找不到的對象,而且經過一次標記、清理,仍然沒有復活的對象。
3、做什么
a、刪除不使用的對象,騰出內存空間
b、隨便說說一些停止線程,運行finalize的說明
c、說說eden區和from suvivor和to suvivor干啥用的,老年代中的標記清理和復制清理等等
d、刪除不使用的對象,回收內存空間;運行默認的finalize,當然程序員想立刻調用就用dipose調用以釋放資源如文件句柄,JVM用from survivor、to survivor對它進行標記清理,對象序列化后也可以使它復活。
是不是看到上面的答案,發現好多坑。
