記憶體管理 要精打細算——已發《電腦報》

來源:互聯網
上載者:User

求職不怕考

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方法進行記憶體的清理。

 

       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.