Блог
Сто ступеней потолка кучи
Команда ARMANOS6 мин
Что странице позволено спросить
Любой сценарий в браузере на Chromium читает потолок памяти, которую ему позволено держать. Разрешения у человека никто не спрашивает, и на странице этого не видно.
Читать это значение стоит по одной причине: оно описывает не страницу. Оно посчитано от памяти машины, которая лежит под ней.
Сто ступеней и ничего между ними
Округлённый ответ это не округление на глаз, а место в готовой таблице. Мы посчитали её дословной копией исходника движка и сосчитали, что вышло.
В каждой ступени три значащие цифры, а соседи стоят примерно в шести процентах друг от друга. Число, попавшее между двумя, доходит до страницы уже не таким.
| Посчитано исходником движка | Сколько |
|---|---|
| Ступеней в таблице | 100 |
| Нижняя и верхняя ступень | 10 000 000 и 3 760 000 000 |
| Значащих цифр в ступени | 3 |
| Расстояние между соседями | около 6 процентов |
| Самый малый и самый большой разрыв | 600 000 и 220 000 000 |
Почему ступень прячет лучше счёта
Одна ступень достаётся всем, чей настоящий потолок попал внутрь неё. Наверху таблицы эта полоса шириной 220 000 000 байтов, и очень разные машины отвечают одинаково.
Точный счёт байтов устроен наоборот. Это арифметика одной машины и одной сборки, от захода к заходу он тот же, и собирают как раз такие значения.
77 ступеней из ста лежат ниже миллиарда байтов. Внизу таблица подробнее, чем наверху, и малая машина описана точнее большой.
Из чего складывается это число
Потолок это две части: долгоживущая, посчитанная от памяти, и короткоживущая, которая приходит от сборки.
Настольному профилю положена половина заявленной памяти, а телефонному четверть. Ниже 256 МБ и выше 4 ГБ не выходит ни та, ни другая.
Что программа меняет и что оставляет
Заменяется только долгоживущая часть, и на её место встаёт число, положенное заявленной памяти. Короткоживущая переносится как есть: она принадлежит сборке, и вписанная рукой она сделала бы примету на ровном месте.
Когда заявленная память и так сходится с машиной под ней, значение не трогается вовсе.
- 1
Заявленная память задаёт долгую часть
Половина у настольного профиля и четверть у телефонного.
- 2
Короткая часть переносится как есть
Она приходит от сборки и остаётся прежней.
- 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, и таблица на ней кончается. Точный счёт бывает выше, и на приёмке так и вышло.
- Меняется ли заявленная память от запуска к запуску?
- Нет. Она выводится из зерна профиля, поэтому один и тот же профиль отвечает одинаково на любой машине.
- Видит ли сайт, что значение поправили?
- Он читает одно обычное число и не видит, чем оно получено. Видит он другое: сходится ли это число с памятью, которую заявляет профиль.
- Меняет ли что-нибудь прокси?
- Нет. Адрес приходит со стороны, а это число рождается на машине перед вами.
Рядом с этим
Память устройства
Второе число о памяти, которое читает сайт, и чего оно стоит.
V8
Часть браузера, которая исполняет сценарии и держит кучу.
Что читает площадка
Весь набор ответов, который отдаёт один визит.
Движок, который мы собираем
Что правится внутри браузера, а не на странице.
Бесплатная проверка отпечатка
12 значений, прочитанных в вашем браузере, и ни одного запроса наружу.
Посмотрите свой отпечаток браузера
Проверка читает 12 значений в вашем браузере и не отправляет их никуда. Потолка кучи среди них нет.