為什麼腳本語言GC使用了引用計數法?


看到PHP Perl Python 垃圾回收的時候都是引用計數法,

我記得Python不是純粹的引用計數。

這是為什麼了?有什麼原因嗎?

很可能是因為實現簡單。

JAVA卻不是。

人家也不是腳本語言啊。


知乎現在已經沒什麼人噴那句「問為什麼之前,請先問是不是」了吧……


Java的GC是generational gc,V8的也是。總體來說,gc如何implement應該需要綜合efficiency,complexity,fragmentation等考慮,同意上面的說法大多數情況下腳本語言考慮的就是簡單啊!re?ference counting最簡單了


引用計數器無法解決循環引用的問題


引用計數 實現簡單性能高,但是有循環引用的問題

根集掃描,沒有這個問題但是性能慢。

所以用計數來釋放一部分然後gc用根集掃描


腳本語言的垃圾回收方式通常有兩種

1 引用計數,比如cpython

優點: 可以即時釋放對象,不依賴gc

缺點: 無法處理循環引用,需要gc去檢測循環引用;

虛擬機實現複雜,引用計數的加減處理要很小心。

2 標記刪除法,如lua

優點: 虛擬機實現簡單,也不用擔心循環引用

缺點: 不能即時刪除對象,必須依賴gc來回收內存。


現在一般gc都會使用多種機制,很少單單一個引用計數的。

順便吐槽一下完全沒有引用計數的語言,比如java, 打開一個文件都要自己在finalize里關是什麼意思,還是不是全自動垃圾收集啦。。。

要是自己不關就只能聽gc的天由命,連什麼時候關的都不知道。。。


腳本語言不清楚,說說java吧,應該都差別不大

上古時期就不是了吧,引用計數法有致命的缺陷,無法解決循環引用的問題,

後來用的演算法都是優化後的演算法,

比如複製收集,多適用年輕代,(臨時對象多永久對象少)

比如標記清除和標記整理,多用於年老代(永久對象多,臨時對象少)

用詞不太專業,見笑


至少 V8 就不是…… PyPy 好像也不是……


推薦閱讀:

對於學自然語言處理方向的學生來說,學 Perl 好還是學 Python 好?理由是什麼?
學習perl兩個月感覺還是什麼都不會,怎麼辦?
如何用python實現行列互換?
Perl、PHP、Python、Ruby對於入門的Linux運維來說,哪個更易學?
Ruby、Perl、Python、Lua等語言相互之間都有哪些異同點?

TAG:Python | PHP | 編程 | Perl | GC垃圾回收計算機科學 |