JVM的回收機(jī)制給開發(fā)人員帶來很大的好處路召,不用時刻處理對象的分配與回收勃刨,可以更加專注于更加高級的代碼實現(xiàn)。相比起Java股淡,C與C++等語言具備更高的執(zhí)行效率身隐,他們需要開發(fā)人員自己關(guān)注對象的分配與回收,但是在一個龐大的系統(tǒng)當(dāng)中唯灵,還是免不了經(jīng)常發(fā)生部分對象忘記回收的情況贾铝,這就是內(nèi)存泄漏。
原始JVM中的GC機(jī)制在Android中得到了很大程度上的優(yōu)化埠帕。Android里面是一個三級Generation的內(nèi)存模型垢揩,最近分配的對象會存放在Young Generation區(qū)域凿可,當(dāng)這個對象在這個區(qū)域停留的時間達(dá)到一定程度硫惕,它會被移動到Old Generation,最后到Permanent Generation區(qū)域吞杭。
每一個級別的內(nèi)存區(qū)域都有固定的大小呐籽,此后不斷有新的對象被分配到此區(qū)域锋勺,當(dāng)這些對象總的大小快達(dá)到這一級別內(nèi)存區(qū)域的閥值時,會觸發(fā)GC的操作狡蝶,以便騰出空間來存放其他新的對象庶橱。
前面提到過每次GC發(fā)生的時候,所有的線程都是暫停狀態(tài)的贪惹。GC所占用的時間和它是哪一個Generation也有關(guān)系苏章,Young Generation的每次GC操作時間是最短的,Old Generation其次馍乙,Permanent Generation最長布近。執(zhí)行時間的長短也和當(dāng)前Generation中的對象數(shù)量有關(guān)垫释,遍歷查找20000個對象比起遍歷50個對象自然是要慢很多的。
雖然Google的工程師在盡量縮短每次GC所花費的時間撑瞧,但是特別注意GC引起的性能問題還是很有必要棵譬。如果不小心在最小的for循環(huán)單元里面執(zhí)行了創(chuàng)建對象的操作,這將很容易引起GC并導(dǎo)致性能問題预伺。通過Memory Monitor我們可以查看到內(nèi)存的占用情況订咸,每一次瞬間的內(nèi)存降低都是因為此時發(fā)生了GC操作,如果在短時間內(nèi)發(fā)生大量的內(nèi)存上漲與降低的事件酬诀,這說明很有可能這里有性能問題脏嚷。我們還可以通過Heap and Allocation Tracker工具來查看此時內(nèi)存中分配的到底有哪些對象。