首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[技術短文]

垃圾!


台北市去年開始實施垃圾費隨袋徵收之後,垃圾量減少了許多,資源回收量也開始大增,大家都說這是個不錯的政策。此次春節前,台北市政府為了便民,宣布兩天開放不收垃圾費(不需專屬垃圾袋),結果換來的是一場垃圾清運人員的噩夢。大量的垃圾堆積在各巷道路口,台北市成了垃圾城。

不過這樣的場景我可是處變不驚了。畢竟我的大學時代四年是在中壢度過,這四年中,中壢市不斷地發生垃圾風波,有時候甚至整個桃園地區都浸在酸敗腐臭的垃圾堆中,我常常騎車騎一半就要停在路邊嘔吐一番,然後暈眩著繼續上路,到了目的地之後,整個人都虛脫了。經過了這樣的大風大浪,你說我怎麼會把台北市的這些垃圾放在眼裡,更何況台北市的這些垃圾還大都是「新鮮」的,不像當時中壢的垃圾是一兩週或一兩個月的(寫到這裡,我打字的手顫抖起來)。

垃圾問題在現實生活中令人頭痛,垃圾問題在軟體技術圈子同樣令人頭痛。

自動記憶體管理也就是俗稱的垃圾收集(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 虛擬機器快去收垃圾,而不「保證」會去收垃圾。文件都寫得如此謙虛了,你也不應該對它寄予太多厚望。對於記憶體資源消耗太多的缺失,目前你能做的是:
  1. 改用一個記憶體管理方式好一點的虛擬機器:垃圾收集是一個豐富又龐大的主題。垃圾收集的演算法有數百種可能,而且各有專長。許多虛擬機器採用的演算法都不太一樣,建議各位多去比較幾家。
  2. 少製造垃圾:許多時候你製造了一堆不該製造的垃圾,比方說:該用固定式陣列的時候卻用 Vector,該用 StringBuffer 的時候卻用 String...... 等等。這麼會製造垃圾,再多記憶體也不夠用。
  3. 不再使用的物件要盡早設定為 null,以便早點被當成垃圾清掉。
  4. 花錢多買一些 RAM(砸錢解決問題,這是我最愛用的方式)。

垃圾,真的這麼讓人討厭嗎?那倒不盡然,我最喜歡的樂團之一就叫做垃圾(Garbage),主唱雪莉曼森(Shirley Manson)的聲音真是迷死人了。比起名字很囂張,但歌聲是垃圾的那些偶像,這時候雪莉曼森的垃圾儼然成了一種諷刺。

本文作者:蔡學鏞
張貼日期:2/07/01

| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch