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