Перейти к содержимому

Блог

Сто ступеней потолка кучи

В браузере на Chromium страница может спросить, сколько памяти позволено держать её сценариям. У браузера два способа ответить, и округлённый кладёт число на одну из ста ступеней, которые мы посчитали исходником самого движка.

Команда ARMANOS6 мин

Что странице позволено спросить

Любой сценарий в браузере на Chromium читает потолок памяти, которую ему позволено держать. Разрешения у человека никто не спрашивает, и на странице этого не видно.

Читать это значение стоит по одной причине: оно описывает не страницу. Оно посчитано от памяти машины, которая лежит под ней.

Сто ступеней и ничего между ними

Округлённый ответ это не округление на глаз, а место в готовой таблице. Мы посчитали её дословной копией исходника движка и сосчитали, что вышло.

В каждой ступени три значащие цифры, а соседи стоят примерно в шести процентах друг от друга. Число, попавшее между двумя, доходит до страницы уже не таким.

Посчитано исходником движкаСколько
Ступеней в таблице100
Нижняя и верхняя ступень10 000 000 и 3 760 000 000
Значащих цифр в ступени3
Расстояние между соседямиоколо 6 процентов
Самый малый и самый большой разрыв600 000 и 220 000 000

Почему ступень прячет лучше счёта

Одна ступень достаётся всем, чей настоящий потолок попал внутрь неё. Наверху таблицы эта полоса шириной 220 000 000 байтов, и очень разные машины отвечают одинаково.

Точный счёт байтов устроен наоборот. Это арифметика одной машины и одной сборки, от захода к заходу он тот же, и собирают как раз такие значения.

77 ступеней из ста лежат ниже миллиарда байтов. Внизу таблица подробнее, чем наверху, и малая машина описана точнее большой.

Из чего складывается это число

Потолок это две части: долгоживущая, посчитанная от памяти, и короткоживущая, которая приходит от сборки.

Настольному профилю положена половина заявленной памяти, а телефонному четверть. Ниже 256 МБ и выше 4 ГБ не выходит ни та, ни другая.

Что программа меняет и что оставляет

Заменяется только долгоживущая часть, и на её место встаёт число, положенное заявленной памяти. Короткоживущая переносится как есть: она принадлежит сборке, и вписанная рукой она сделала бы примету на ровном месте.

Когда заявленная память и так сходится с машиной под ней, значение не трогается вовсе.

  1. 1

    Заявленная память задаёт долгую часть

    Половина у настольного профиля и четверть у телефонного.

  2. 2

    Короткая часть переносится как есть

    Она приходит от сборки и остаётся прежней.

  3. 3

    Вид ответа сохраняется

    Ступень остаётся ступенью, а точный счёт точным.

Чтение на собранном движке

Приёмка читает это значение на собранном движке, а не верит арифметике на слово. На сборке для Windows оно вышло 4 192 МБ при 4 096 МБ долгой части, положенной профилю.

Разница это короткоживущая часть той сборки. Ступенью это число тоже не является, и так браузер отвечает вторым способом.

Оба вида ответа обычны

Профиль, который всегда отвечает ступенью, выделялся бы ровно там, где хотел слиться, поэтому вид нашего ответа повторяет вид настоящего.

Как прочитать своё

В браузере на Chromium откройте окно разработчика, прочитайте performance.memory.jsHeapSizeLimit и поделите на 1024 дважды, чтобы получить мегабайты.

Округлённый ответ узнаётся сразу: три цифры, а дальше нули до конца. Всё, что выше 3 760 000 000, из таблицы не приходило.

Чего это не утверждает

  • Это не утверждает, что сошедшийся потолок делает профиль безопасным. Убрано одно расхождение из многих, а поведение, платёжные данные и история аккаунта остаются нетронутыми любым браузером.
  • Это не утверждает, что это значение читает каждый сайт. В стандарт оно не входит, и есть оно не в каждом браузере.
  • Короткоживущая часть остаётся как есть, поэтому потолок никогда не сходится с заявленной памятью байт в байт. Самопроверка ждёт согласия с запасом, а не точного числа.
  • Сто ступеней посчитаны на поколении движка, которое едет сегодня. Следующее может сдвинуть таблицу, поэтому файл пересчитывается, а не берётся на веру.

Где это можно увидеть самому

Каждое число выше выходит из файла, который можно открыть и пересчитать.

Сто ступеней считает дословная копия исходника движка
docs/замеры/ступени-памяти-153.cc · docs/замеры/ступени-памяти-153.txt
Таблица пересобирается и сверяется ступень за ступенью
packages/shared/test/ступени-памяти-как-у-движка.js
Потолок, положенный профилю, считается в одном месте
packages/shared/src/index.js
Движок заменяет долгоживущую часть и больше ничего
engine/patches/armanos-fp-0012.newfiles.tgz · engine/patches/armanos-fp-0014-memory.diff
Чтение, снятое на собранном движке
docs/замеры/приёмка-windows-02-09.json

Вопросы

Зачем вообще округлять число?
Точный счёт байтов почти уникален для одной машины и одной сборки, а ступень достаётся очень многим. Округление придумано не нами, оно живёт в самом движке.
Показывают ли ровно четыре гигабайта?
Округлённый ответ нет: верхняя ступень 3 760 000 000, и таблица на ней кончается. Точный счёт бывает выше, и на приёмке так и вышло.
Меняется ли заявленная память от запуска к запуску?
Нет. Она выводится из зерна профиля, поэтому один и тот же профиль отвечает одинаково на любой машине.
Видит ли сайт, что значение поправили?
Он читает одно обычное число и не видит, чем оно получено. Видит он другое: сходится ли это число с памятью, которую заявляет профиль.
Меняет ли что-нибудь прокси?
Нет. Адрес приходит со стороны, а это число рождается на машине перед вами.

Посмотрите свой отпечаток браузера

Проверка читает 12 значений в вашем браузере и не отправляет их никуда. Потолка кучи среди них нет.