求職不怕考
pcw-chendx@vip.sina.com
與編程相關的招聘,都會準備很多考題,一不小心考生就在考題上栽了跟頭,特別是沒有多少工作經驗的應屆畢業生,往往回答得過於理論化,很難令考官滿意。為此,我們特意推出本系列,通過對真實考題的分析讓大家在回答考題時有更多的實用性,讓考官滿意,順利找到工作。
記憶體管理 要精打細算
爪哇米工作室 陳躍峰
記憶體管理,是軟體開發的一個重點,在功能不變的情況下,如何更有效利用記憶體,減少資源的佔用是衡量軟體效能的重要指標之一。所以,很多公司在招聘時會側重記憶體管理的考查。
招聘題目:下面的代碼(Java)是否正確地釋放了記憶體空間?為什嗎?
Image
img[] = new Image[10];
for(int
i = 0;i < 10;i++){
img[i]
= Image.createImage(“/img/” + i + “.png”);
}
img
= null; //釋放記憶體
題目答案:該代碼未釋放全部記憶體,正確的釋放全部記憶體的代碼應該是:
Image img[] =
new Image[10];
for(int
i = 0;i < 10;i++){
img[i]
= Image.createImage(“/img/” + i + “.png”);
}
//依次釋放圖片佔用的記憶體
for(int
i = 0;i < 10;i++){
img[i]
= null;
}
img
= null; //釋放圖片數組的記憶體
代碼中,img=null僅僅釋放了圖片數組對象佔用的記憶體,而每一個圖片對象佔用的記憶體沒有被釋放,所以如果需要釋放全部記憶體,則要先釋放每個圖片對象佔用的記憶體,再釋放圖片數組佔用的記憶體,則這樣能達到正確釋放記憶體的目的。
不可忽視記憶體佔用
考官出這樣的題目,目的是測試程式員是否有工作經驗,是否對於記憶體管理有足夠的認識。在軟體開發中,記憶體管理不當會輕則會導致工作效率低下,重則可能會導致系統崩潰,所以記憶體管理的設計不能有疏忽。
在手機軟體的開發中,因為手機記憶體不大,對記憶體管理的要求更加嚴格,有志於從事手機軟體的開發的朋友一定要多加註意,多實踐,增加程式執行效率的體驗,這樣才可以在招聘中脫穎而出。
實際應用
在實際的開發過程中,記憶體是怎麼管理的?是如何提高執行速度和效率的?下面我們通過兩組代碼來進行說明。代碼的功能是節約記憶體,第一組代碼的效果不好。
代碼1:
public void paint(Graphics g){
……
g.drawString(“loading…”,100,100,Graphics.TOP
| Graphics.LEFT);
……
}
點評:該代碼的功能是繪製字串“loading…”,功能可以實現,但是系統每次繪製都需要產生一個字串對象,比較浪費記憶體,而且每次都需要計算錨值,這將降低程式的執行效率。
代碼2:
public void run(){
……
while(true){
int n = 10;
……
System.gc();
}
}
點評2:在該代碼中,線上程run中的迴圈內部,每次都生命一個int變數n,這樣每次都需要為n分配記憶體,在迴圈結束時還每次都調用gc方法,效率低下。
第二組代碼可以節約記憶體。
代碼1:
public static final int TOPLEFT =
Graphics.TOP | Graphics.LEFT; //避免重複計算
private String loadStr = “loading…”; //只產生一次字串對象
public void paint(Graphics g){
……
g.drawString(loadStr,100,100, TOPLEFT);
……
}
點評:通過聲明TOPLEFT常數,避免重複計算,節約記憶體並提高程式的執行速度。通過聲明loadStr對象,使字串對象只在記憶體中產生一次,節約記憶體使用量。
代碼2:
public void run(){
……
int n = 10;
Runtime rt = Runtime.getRuntime();
while(true){
……
if(rt. freeMemory() <
102400){ //可用記憶體小於100K
System.gc();
}
}
}
點評:通過在迴圈中聲明變數n,節約記憶體的使用。在實際的開發中,很多人認為記憶體管理就是使用System.gc進行記憶體清理,其實良好的記憶體使用量習慣才是最主要的,頻繁的調用System.gc()甚至會顯著降低程式的執行效率,所以正確的使用方法是當可用記憶體小於一定數值時,才調用gc方法進行記憶體的清理。