上一章簡單的示範了一個helloworld demo。裡面涉及到了v8的一些基本類型和概念,本章将圍繞這個demo對v8的基本類型和相關概念進行講解。
這裡還是先把demo貼出來便于後面分析:
handle
在v8中,記憶體配置設定都是在v8的heap中進行配置設定的,javascript的值和對象也都存放在v8的heap中。這個heap由v8獨立的去維護,失去引用的對象将會被v8的gc掉并可以重新配置設定給其他對象。而handle即是對heap中對象的引用。v8為了對記憶體配置設定進行管理,gc需要對v8中的所有對象進行跟蹤,而對象都是用handle方式引用的,是以gc需要對handle進行管理,這樣gc就能知道heap中一個對象的引用情況,當一個對象的handle引用為發生改變的時候,gc即可對該對象進行回收(gc)或者移動。是以,v8程式設計中必須使用handle去引用一個對象,而不是直接通過c++的方式去擷取對象的引用,直接通過c++的方式去直接去引用一個對象,會使得該對象無法被v8管理。
handle分為local和persistent兩種。從字面上就能知道,local是局部的,它同時被handlescope進行管理。persistent,類似與全局的,不受handlescope的管理,其作用域可以延伸到不同的函數,而local是局部的,作用域比較小。persistent handle對象需要persistent::new, persistent::dispose配對使用,類似于c++中new和delete.persistent::makeweak可以用來弱化一個persistent
handle,如果一個對象的唯一引用handle是一個persistent,則可以使用makeweak方法來如果該引用,該方法可以出發gc對被引用對象的回收。
handlescope
一個函數中,可以有很多handle,而handlescope則相當于用來裝handle(local)的容器,當handlescope生命周期結束的時候,handle也将會被釋放,會引起heap中對象引用的更新。handlescope是配置設定在棧上,不能通過new的方式進行建立。對于同一個作用域内可以有多個handlescope,新的handlescope将會覆寫上一個handlescope,并對local handle進行管理。下面通過代碼來講解handlescope的生命周期:
context
context值得是javascript的執行環境。每個javascript都必須執行在一個context中。context有多個,而且可以在不同的context中進行切換。
這段代碼就是申請一個persistent contetxt,并通過context::scope切換到該context中。在這個demo中,
之後的所有操作都執行在context中。
我們還可以使用
來切換到context_ex中去。
這裡隻是簡單的了解下context的概念,後面将單獨開辟一個章節來詳細講述v8的context。

從這張圖可以比較清楚的看到handle,handlescope,以及被handle引用的對象之間的關系。從圖中可以看到,v8的對象都是存在v8的heap中,而handle則是對該對象的引用。
版權申明:
轉載文章請注明原文出處,任何用于商業目的,請聯系本人:[email protected]