|
[技術短文]
垃圾!
台北市去年開始實施垃圾費隨袋徵收之後,垃圾量減少了許多,資源回收量也開始大增,大家都說這是個不錯的政策。此次春節前,台北市政府為了便民,宣布兩天開放不收垃圾費(不需專屬垃圾袋),結果換來的是一場垃圾清運人員的噩夢。大量的垃圾堆積在各巷道路口,台北市成了垃圾城。
不過這樣的場景我可是處變不驚了。畢竟我的大學時代四年是在中壢度過,這四年中,中壢市不斷地發生垃圾風波,有時候甚至整個桃園地區都浸在酸敗腐臭的垃圾堆中,我常常騎車騎一半就要停在路邊嘔吐一番,然後暈眩著繼續上路,到了目的地之後,整個人都虛脫了。經過了這樣的大風大浪,你說我怎麼會把台北市的這些垃圾放在眼裡,更何況台北市的這些垃圾還大都是「新鮮」的,不像當時中壢的垃圾是一兩週或一兩個月的(寫到這裡,我打字的手顫抖起來)。
垃圾問題在現實生活中令人頭痛,垃圾問題在軟體技術圈子同樣令人頭痛。
自動記憶體管理也就是俗稱的垃圾收集(garbage-collection),可以讓程式員減輕許多負擔,也減少程式員犯錯的機會,所以相當受歡迎。從早期的
Smalltalk,Eiffel,到近期的 Java,C#,Python,REBOL,Ruby... 等,通通支援垃圾收集。垃圾收集差不多已經成了新一代高階程式語言必備的功能。
在 Java 中,你不需要主動刪除物件,而是由 Java 虛擬機器代勞。Java 虛擬機器會「持續追蹤」每個物件被使用的情形,如果某物件未被用到,Java
虛擬機器就會自動將其釋放。而要如何「持續追蹤」,實作細節留給 Java 虛擬機器的實作者發揮。
在早期,許多虛擬機器只是將垃圾收集實作成一個執行緒,一再進行檢查,遇到垃圾就釋放其記憶體。因為垃圾收集應該盡量不要影響到原程式的執行,所以虛擬機器將此執行緒的優先權設為
0(最低)。如此一來,當系統有其它執行緒在運作時,就不會進行垃圾收集,所以常常很久才會收集到垃圾,造成記憶體不足。但又不能因此調高其優先權,否則對
Java 的執行效率是一大打擊。所以,我們這些 Java 程式員的電腦 RAM 都要至少 256 MB,否則根本沒辦法順利執行 JBuilder
或 VisualAge for Java 等 Java 開發工具,因為這些開發工具本身就是專門吃記憶體的 Java 程式。我甚至在我的筆記型電腦上裝了
512MB 的 RAM。
於是許多人懷念起 C/C++ 來了,他們認為如果 Java 能同時支援自動記憶體管理和手動記憶體管理,那麼該有多好!他們甚至希望
Java 未來的版本能允許他們主動釋放記憶體,比方說:
-
MyBigObject
obj = new MyBigObject();
// do something here...
delete obj;
如果你也這麼希望的話,我勸你早點死了這條心吧!Java 語言的主要精神之一是 robust,如果
Java 同時支援這兩種記憶體管理的話,可能會造成程式中有許多潛在的 Bug,記憶體不當存取的問題會比 C/C++ 更嚴重,所以是不可能這麼做的。
java.lang.System.gc()
或 java.lang.Runtime.gc()
的 gc 指的就是 garbage-collection,不過根據文件的說明,它的作用只是「建議」Java
虛擬機器快去收垃圾,而不「保證」會去收垃圾。文件都寫得如此謙虛了,你也不應該對它寄予太多厚望。對於記憶體資源消耗太多的缺失,目前你能做的是:
- 改用一個記憶體管理方式好一點的虛擬機器:垃圾收集是一個豐富又龐大的主題。垃圾收集的演算法有數百種可能,而且各有專長。許多虛擬機器採用的演算法都不太一樣,建議各位多去比較幾家。
- 少製造垃圾:許多時候你製造了一堆不該製造的垃圾,比方說:該用固定式陣列的時候卻用 Vector,該用
StringBuffer 的時候卻用 String...... 等等。這麼會製造垃圾,再多記憶體也不夠用。
- 不再使用的物件要盡早設定為 null,以便早點被當成垃圾清掉。
- 花錢多買一些 RAM(砸錢解決問題,這是我最愛用的方式)。
垃圾,真的這麼讓人討厭嗎?那倒不盡然,我最喜歡的樂團之一就叫做垃圾(Garbage),主唱雪莉曼森(Shirley
Manson)的聲音真是迷死人了。比起名字很囂張,但歌聲是垃圾的那些偶像,這時候雪莉曼森的垃圾儼然成了一種諷刺。
本文作者:蔡學鏞
張貼日期:2/07/01 |