當前位置:編程學習大全網 - 源碼下載 - 上下文源代碼原則

上下文源代碼原則

QuickJS是壹個輕量級的JavaScript引擎,可以代替V8實現JS腳本的執行。想要使用QuickJS,必須了解它的垃圾收集原理,否則很容易出現野指針或者內存泄漏,導致程序崩潰。本文通過源代碼分析了QuickJS的垃圾收集原理。

QuickJS使用引用計數方法來判斷壹個對象是否可以被釋放。引用計數方法非常簡單。通過給壹個對象分配壹個定時器,對象被引用的次數被保存。如果該對象被其他對象引用,則增加1。如果刪除引用,則減少1。當參考計數器為0時,將被回收。

JSRuntime是QuickJS最底層的執行環境,不用的時候需要及時釋放。

壹個JSRuntime可以創建多個上下文,每個上下文相互隔離,不使用時需要及時釋放。

如果需要自己創建和關聯js對象,需要處理引用問題,必須通過C創建壹個JSValue對象,那麽就需要手動釋放,否則會導致內存泄漏,多次釋放都不行,還會導致野指針,導致程序崩潰。如果只是運行JS腳本,就不需要關心這個問題,引擎已經搞定了。

通過上面的例子我們知道引用計數方法是通過JS_DupValue記錄引用+1,JS_FreeValue從引用中減去1,然後通過源代碼分析如何實現。

引用計數器頭是壹個結構,目前只有壹個int值,用來記錄對象的引用次數。

參考計數器+1

JS_FreeValue處理引用計數器-1。如果引用屬於小於0,將進行垃圾回收。這就引入了參考計數器的最大問題。如果A指B and B也指A,這種相互套用會不會導致A和B都不能回收?

JS_RunGC函數用於解決交叉引用問題,會在特定時間觸發。

以上兩個函數完成後,tmp_obj_list將只有環中引用的對象,gc_free_cycles()將回收tmp_obj_list中的對象,對屬性的引用為-1。

  • 上一篇:大神知道這是加過密嗎,json文件?
  • 下一篇:節約用水活動總結
  • copyright 2024編程學習大全網