再探 flash memory leak 問題
flash VM 有不少memory leak問題是大家早就知道的事,通常比較明顯的症狀是記憶體不斷被吃掉,有時一個flash 程式甚至可以吃到1GB左右的ram(如果你有裝那麼多的話),而比較確切的証據是virtual memory快速的消失,但實體 memory不會有太大變動。
*memory leak的2個原因
會發生這種事主要的原因有兩個
1、flash VM 的 garbage collection設計不良:flash player 7是採用 reference counting的方式在記錄那些物件該在每一次的GC中被移掉(例如已用不到的object, variable, movieclip…),但麻煩的地方在於flash的程式中都是 passing by reference,因此往往一個物件生成後,會被許多其它物件以reference的形式保存起來,結果這就造成VM在做GC時基本上什麼也不敢移除,這樣東加名加,當物件一多時,memory leak就來了。
2、程式本身寫作不良:在之前的文章中曾提過「清垃圾之重要」,許多人(99%的設計師與70%的as coder)寫程式時並沒有順便清垃圾的觀念,例如用完的變數就隨手delete 刪掉,或是已用不到的movieclip就用 unloadMovie(), removeMovieClip()移除,而這些沒拿掉的變數、物件與MC就是吃掉memory的元兇。
更糟的是,當flash 程式的生命週期變長時這個問題會更嚴重,以往做個game或片頭動畫甚至是全flash的網站,通常都只會在browser內存在幾分鐘(因為game一下就玩完了、片頭動畫可以按skip跳過而全flash的網站十個有二十個做的usability很糟因此user會直接關掉閃人), 在生命週期很短的情況下,就算有memory leak的情況也難以嚴重到造成大問題。
但當flash成為一個platform而用於application時,這個問題就嚴重許多,因為通常app的生命週期都會很長,短則十分鐘,長則一整天都開者(例如像word, outlook),這種情況下memory leak就有可能造成很嚴重的後果,例如讓電腦當掉或吃光cpu資源最後user只好重開。
對於這件事,macromedia其實不是不知道,下面是在list上看到的一段qoute:
We contacted MM and after several phone conference calls and sending
them a bunch of source we were informed that theFlash player was not intended to run as an application for long periods of time.
沒錯,看到這段時我跟你一樣嚇出一身冷汗,這個回答就好比toyota跟你說:呃,我們的altis並不是設計來高速行進,因此如果你開超過80km/h而出車禍就不是我們的錯囉….
*現行的解決方案
不過好在這件是發生在flash player 7 非常早期的時後,而這個問題在flash player 8 也已獲得很好的解決,方法就是採用其它vm做GC 的方式,不用要reference counting而是用total collection來記錄每個物件的狀態,並且讓GC發生的頻率更多也更有效率。
當然有一點還是要記得,VM內建的GC是最後一道防衛,並不代表寫程式的人就可以隨心所欲放任用不到的東西散亂一地,能夠養成隨手清垃圾的習慣長遠來看一定還是會有好處的(至少可能不會再有一堆莫名其妙的infinite loop)。
同時按照過去新player發表的記錄來看,通常要四到八個月的時間新版player的 penetration率才能到達90%以上,這代表從現在到年底甚至明年三四月這段期間,大部份人仍然會使用flash player 7 (也就是有memory leak問題的版本),因此與其等待天堂靠近,不如自已走過去吧 ‧
不過另一件值得高興的事是這次mm也推出了新的線上安裝方式,下載速度更快,出錯機率更少,同時由於flash player 8實在有者太多吸引人的feature sets,因此應該可以引誘一般使用者更有意願下載安裝(例如為了看到即時的bitmap 影像效果,或是使用檔案上下傳的功能 — 個人推測不出一個月就會有人寫個flash版的相簿管理程式,做到類似 picas 的事,像這樣的應用就非常需要 flash player 裏的 upload/download 功能了。)


Trackback this post | Subscribe to the comments via RSS Feed