纏纏綿綿的v8與c++ | 之二

Embedder's Guide(記得FQ)

 

若是你已經讀過 Getting Started, 那麼如今,你已經對V8的一些關鍵概念比較熟悉了。好比,V8是一個獨立的虛擬機,V8的handle,scope和context的概念。安全

這篇文章更進一步討論了這些概念,而且介紹了另外的一些將V8嵌入到C++中相當重要的概念。數據結構

 

V8的API提供了這樣一些功能,包括編譯和執行腳本,訪問C++中的方法和數據結構,處理錯誤以及開啓安全檢查。你的應用程序能夠像使用其餘一些C++庫同樣來使用V8,而只須要包含它的頭文件 v8.h。ide

 

V8 Design Elements 提供了一些關於V8的背景知識,若是你想優化你的V8應用程序,你應該會感興趣的。函數

 

適合本文的讀者優化

這篇文章適用於那些想把V8 JavaScript引擎嵌入到C++程序中,同時讓JavaScript和C++中的對象和方法互相可見的C++程序猿。ui

 

Handles(句柄)和垃圾回收google

一個Handle指向一個在堆中的JavaScript對象。 V8垃圾蒐集器回收那些沒法被再次訪問的對象所佔用的內存。在垃圾蒐集過程當中,蒐集器時常將對象移動到一個不一樣的位置(固然,對象至始至終都在堆中)。不過不用擔憂,當垃圾蒐集器移動對象時,它會自動更新每一個Handle,以確保它們指向原來的對象。spa

如何斷定一個對象變成垃圾了呢?對象

若是一個對象已經沒法在JavaScript中被訪問,而且也沒有Handle指向它,這個時候,它就被認定成垃圾了。生命週期

垃圾蒐集器會時不時的處理掉這些垃圾來回收內存。

V8的垃圾蒐集機制是V8良好表現的重要緣由,若是你想深刻了解,V8 Design Elements 也包含了相關內容。

 

Handle的各類類型:

a. Local handle(局部句柄?)存在於棧中,當相關的析構函數被調用時,會被自動清理掉。這些Local handles的生命週期由容納它們的handle scope決定。Handle scope一般在函數調用之初被建立。當Handle scope被刪除時,垃圾蒐集器將大開殺戒,清除掉全部Handle scope中的handle所指向的對象。固然,這些對象就不可能再在JavaScript中被訪問,也不會被其它的handle來指向了。這種類型的handle在Getting Started(見「之一」)能夠找到。

Local handle的形式爲:Local<SomeType>

注意:Handle的棧並非C++棧的一部分,但handle scope的棧倒是嵌入在C++的棧中的。並且Handle scope只能在棧中被建立,也就是說不能new出來(爲何?由於new出來的東東存在於堆中)。

b. 

相關文章
相關標籤/搜索