swift ... 這種沒有 GC 的語言,適合跑 server application 嗎?
server 的程式通常都要跑個幾個月,有一點點 memory leak 就會逐漸累積,跟 desktop/mobile app 的使用行為差很多啊。mobile 上就算有點 leak,用戶也是常重開 app,沒什麼差。
除了那種很專精功能的 server 程式,通常寫應用程式型的 server ,需求和功能都很雜亂 (尤其是開發了一兩年後… ) 這種情形下還要開發者自行管理記憶體真是太痛苦。
還有,踩到 dangling pointer 怎麼辦?整個 swift process crash 嗎?一旦 crash 了,process 裡的 state 就通通消失了… (反觀 Java 的 NullPointerException,死也是死個 request 而已)
有關 GC, 正好相反, Swift 的 ARC 原理是自動加入 alloc/dealloc, 所以有一個(理論上)穩定的 memory model。比如某個Variable已經不會再用, 那compiler就可以立即把那些memory release。
ARC 又不是萬能的,我不相信有個 iOS app 從來沒踩過 dangling pointer。哪個具規模的 app 不會閃退?
這種「X不是萬能的」有甚麼用呢?GC也不是萬能的, 我也見過Java 的 Server process OOM。
memory leak 和 process crash 怎麼相提並論。有 GC 又不代表不會有 memory leak,這前提還要討論嗎?
問題是沒 GC 你除了處理 memory leak ,還要擔心不小心踩到記憶體,踩到記憶體的懲罰又很嚴重 (尤其不適合要跑好幾個月的 process)
ARC 的確可有效減少踩錯,但跟完全不會踩錯的 GC 比又差了一截,這是很明顯的缺點啊。
你是誤會了甚麼, mobile app 是會 crash, 但很少是因為'dangling pointer'. 你說的'哪個app不閃退'和Memory management根本沒直接關係好不好?
「完全不全會踩錯的GC」如果GC可以完全不會踩錯, ARC為何不可呢?
那閃退的大部份原因是什麼?
很難説大部分原因,因為有很多原因。這樣說吧,android app用 vm 有 GC, 閃退會比較少嗎?據我看的統計不是這樣。
android app 閃退原因多是 exception,大部份是 NullPointerException。
我不是說 android 有 GC 所以 bug 會比 swift iOS 少,閃退會比較少。我只是說 iOS crash 的原因很多是 dangling pointer,是因為要手動管理記憶體造成的。
這個現象對 server 是不利的。Java 是很多 NPE,但在 server 環境下就只是個 bug 而已,process 還是可以繼續服務。swift 踩到記憶體就是整個 crash,這不利 long running application 啊。(mobile 上到是無所謂)
ARC 也許可以再進化,解決這個問題吧 (例如它找到一個演算法完全解決 circular reference),不然只要讓開發者去寫 unowned 這種東西,就是有機會踩記憶體 crash。(有誰的 app 沒 unowned ??)
至於crash就是另一個問題, 那也不一定只是 dangling pointer (Swift 本身沒有pointer, 你不用 C code / UnsafePointer 想搞出個 dangling pointer 也還不易), 但nginx Apache httpd 也是用C 寫不見得有問題。