Проблемы с сборщиком мусора на spidermonkey .... JS_AnchorPtr ()? - PullRequest
3 голосов
/ 20 февраля 2012

Я развернул свой собственный язык серверной части JavaScript, называемый bondi. Совсем недавно обновлен до новой обезьяны-паука.

Теперь, когда JS вводит локальные корни и покидает функцию локальных корней, функция api 1.8.5 перестала / бесполезна, достаточно ли просто использовать указатель привязки (JS_AnchorPtr(varname)) в конце вызовов вашей функции, чтобы убедиться, что компилятор не удаляет ссылки, чтобы сделать сборщик мусора счастливым?

Я тестировал его, удалив все ссылки на JS_EnterLocalRootScope ( см. Здесь ) / Оставить локальную корневую область и добавить JS_AnchorPtr() в конец скрипта.

Я посмотрел функцию AnchorPoint в исходном коде обезьяны-паука. Угадай, что ... это ничего не делает. Там тоже нет доко. Я использую его просто для того, чтобы я мог упомянуть эти переменные, чтобы сборщик мусора не убивал их.

1 Ответ

2 голосов
/ 26 февраля 2012

Что ж, похоже, виноват, что ошибка 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 и у вас включена оптимизация времени соединения: вызов между объектами может быть встроеннулевая реализация, исключающая жизнеспособность переменной, и в этом случае могут появиться те же опасности GC.

...