通常來說,要寫Java代碼,你基本上都沒必要聽說垃圾回收這個概念的。這不,對于已經(jīng)寫了多年Java代碼的我來說,我還沒有哪次經(jīng)歷說是需要使用垃圾回收方面的知識來解決問題的。但是,我依然督促自己花了幾天時間系統(tǒng)性地(也比較淺顯地)學習了Java垃圾回收機制。我認為學習Java垃圾回收機制至少可以得到以下幾方面的好處:
對于系統(tǒng)調優(yōu)有直接幫助
增加和同行聊天或者下一份工作面試時的談資
在追求技術卓越上更進一步
(一)Java堆內存的分代管理
Java垃圾回收是需要消耗CPU和內存資源的,其速度隨著內存的變大而減慢,這將嚴重影響系統(tǒng)的性能。同時,Java系統(tǒng)中存在著這么一種現(xiàn)象:大多數(shù)Java對象都是“短命”的?;诖?,Java采用了分代的內存管理方式,并在不同的內存代中采用不同的垃圾回收算法,從而達到對內存更細粒度的管理,最大限度地減小垃圾回收對系統(tǒng)本身的影響。
由上圖所示,Java的堆空間被分為了三個區(qū)域,分別是新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation)。新創(chuàng)建出來的對象首先存放在新生代,經(jīng)過新生代中多次垃圾回收(在Survivor 0和Survivor 1之間來回復制),存活下來的對象將被轉移到老年代。新生代中垃圾回收很頻繁,這樣多數(shù)“短命”的對象將得到及時清理;又由于新生代內存空間通常不大,回收速度也相對較快。在老年代中,存放著從新生代中經(jīng)歷了多次垃圾回收后仍然存活的對象,這些對象相對較少,而老年代內存一般很大,并不容易塞滿,因此老年代的垃圾回收頻率要遠遠低于新生代,從而減少了對系統(tǒng)性能的影響。永久代中主要存放Java類本身的數(shù)據(jù)信息,當Java類不再被使用時,也會被垃圾回收掉。開發(fā)者們通常無法預測永久代的大小,導致程序經(jīng)常出現(xiàn) “java.lang.OutOfMemoryError: Permgen s