開發(fā)這個垃圾收集器的是為了降低用戶使用語言的難度,回避掉內(nèi)存使用的囧事(比如內(nèi)存泄漏)。垃圾收集器工作時,需要掛起用戶程序,等待釋放出不占用的資源后才可繼續(xù)工作。如何提高垃圾收集器的性能顯得非常重要。
1. 垃圾收集器什么時候工作比較合適
垃圾收集器會在內(nèi)存耗盡或內(nèi)存分配達到某個閾值時才進行工作。內(nèi)存耗盡要進行垃圾收集是自然的,但是這個閾值到底該多大才合適呢?太小會造成垃圾收集頻率太高,太大會造成內(nèi)存利用率降低。這里我只是簡單地?zé)o視這個問題,等到內(nèi)存耗盡再進行回收。
2. 多少個分代才合適
垃圾收集器一個工作周期時長極大地依賴于一次收集中存活下來的數(shù)據(jù)。分代越小,時間越短,然而,一個較小的分代會比較大的分代更容易填滿,從而增大了收集的頻率,除非我們更早地提升對象。但是,分代收集是希望盡可能多的對象中年輕的時候死亡,所以對象不應(yīng)該被過早地提升。這里我只是簡單地抄襲了.NET,分成三代。
3. 分代的大小是固定的
Generation的大小如果能隨著內(nèi)存使用情況來改變就好了,不知道要根據(jù)啥規(guī)律來折騰,心理沒譜。
4. 一剛開始垃圾收集器申請的內(nèi)存也是固定大小的
如果內(nèi)存耗盡,垃圾收集后仍然無法提供足夠的內(nèi)存分配給對象,此時我就只能拋出異常了。有在考慮說,是不是要擴大這個內(nèi)存,重新申請,重新分配Generation,到底要根據(jù)啥規(guī)律比較合適暫時還沒明白。
5. 什么時候提升對象
一個對象什么時候提升依賴于這個對象必須在多少次收集中幸存下來。這里我只是簡單地在每次收集后就提升所有的對象,即使某些提升的對象實際上很年輕,會使得年輕對象沒有死亡機會。
到這里關(guān)于垃圾收集器的討論就告一段落了,歡迎大家來噴~