簡體   English   中英

關於spidermonkey的垃圾收集器問題...... JS_AnchorPtr()?

[英]Garbage collector issues on spidermonkey… JS_AnchorPtr()?

我推出了自己的javascript服務器端語言,名為bondi。 剛剛升級到新的蜘蛛猴。

現在JS進入本地根並且離開本地根函數從1.8.5 api消失/無用,只需在函數調用結束時使用錨指針( JS_AnchorPtr(varname) )來確保編譯器不是'刪除引用以保持垃圾收集器的滿意度?

我一直在測試它,刪除我對JS_EnterLocalRootScope的所有引用( 參見這里 )/保留本地根作用域並將JS_AnchorPtr()添加到腳本的底部。

我在蜘蛛猴的源代碼中查找了AnchorPoint函數。 猜猜是什么......它什么也沒做。 它也沒有doco。 我正在使用它,以便我可以提及這些變量,因此垃圾收集器不會殺死它們。

好吧,責備似乎是說錯誤519949建議你使用js :: Anchor,這樣保守的堆棧掃描程序就會把它拿起來。

請注意,保守的掃描程序可以找到堆棧或寄存器中的任何GC事物,因此唯一真正棘手的情況是當“擁有”GC事物可能已經死亡時使用派生值,如下所示:

{
    JSString *str = GetMeSomeStringYo();
    const jschar *chars = str->chars();
    // Note, |str| is not "live" here, but the derived |chars| is!
    // The conservative stack scanner won't see |chars| and know
    // to keep |str| alive, so we should be anchoring |str|.
    DoSomethingThatCanCauseGC();
    return chars[0];
}

如果你正在使用C,那么函數末尾的JS_AnchorPtr就足夠了。 你是正確的,該函數有一個nop實現! 這個想法是,只要它執行對共享對象符號的調用,並將變量保持為參數,調用函數就必須將該值保持在機器狀態以便執行無操作調用。 對於perf而言,這比js :: Anchor更糟糕。

在一個不太可能的情況下,你有一個潛在的陷阱是靜態鏈接SpiderMonkey並啟用了鏈接時間優化:跨對象調用可能內聯一個null實現,消除了變量的活躍性,在這種情況下相同的GC危險可能彈回來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM