Блог
Точное число памяти выдаёт профиль: сто ступеней настоящего браузера
Команда ARMANOS6 мин
Что площадка узнаёт о вашей памяти
Любой сценарий на открытой у вас странице читает потолок памяти, которую ему позволено держать. Разрешения у вас никто не спрашивает, и на странице этого не видно.
Площадке это значение интересно по одной причине: оно описывает не страницу. Оно посчитано от памяти машины, которая стоит под ней.
Сто ступеней и ничего между ними
Округлённый ответ это не округление на глаз, а место в готовой таблице. Таблица стоит внутри самого движка, и ступеней в ней ровно сто.
В каждой ступени три значащие цифры, а соседи стоят примерно в шести процентах друг от друга. Число, попавшее между двумя, доходит до площадки уже не таким.
| Что стоит в таблице движка | Сколько |
|---|---|
| Ступеней в таблице | 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 МБ долгой части, положенной профилю.
Разница это короткоживущая часть той сборки. Ступенью это число тоже не является, и так браузер отвечает вторым способом.
Оба вида ответа обычны
Полосы внизу узкие, наверху широкие
Ступеней сто, а полосы между ними разной ширины. Внизу таблицы это шестьсот тысяч байтов, наверху двести двадцать миллионов.
Значит у слабой машины ответ почти точен, а у сильной огрубляется заметно. Между соседними ступенями наверху помещается больше, чем весь размах внизу.
Это сделано нарочно: у слабых машин значения разбросаны плотнее, и грубая ступень там сказала бы о вас больше, чем точное число. Округление тут защищает как раз тех, у кого машина скромнее, и это редкий случай, когда грубость работает в пользу человека.
Сколько памяти объявляет профиль
Само число памяти профиль берёт жребием из своего зерна, и значений там два: четыре гигабайта и восемь. Настольному и телефонному профилю достаётся один и тот же выбор, и число это ровно то, что читает страница вопросом про память устройства.
Долгая часть кучи считается от этого числа: настольному профилю половина, телефонному четверть. Ниже двухсот пятидесяти шести мегабайт и выше четырёх гигабайт не выходит ни та, ни другая: пол и потолок взяты оттуда же, откуда и сама таблица.
Почему два профиля отвечают по-разному
Память выпадает профилю отдельно от видеокарты и от экрана, своим жребием. Поэтому два ваших профиля на одной машине чаще называют разные числа, хотя стоят рядом и работают у вас же.
Совпадение тут не беда: четыре гигабайта это обычное число, и встречается оно у множества людей. Тревожным было бы обратное, когда все ваши профили отвечают одинаково: это говорит об одной машине яснее, чем любое отдельное число.
Что показывает готовый браузер без нашей правки
На сборке для Windows готовый браузер ответил четыре тысячи сто девяносто два мегабайта при четырёх тысячах девяноста шести, положенных профилю. Разница небольшая, и она именно та, которую даёт сам движок без нашей правки. Профиль при этом объявляет одно число, а браузер отвечает другим, и сходятся они только после заплаты.
Мы считаем это провалом строки, а не мелочью. Замер записан в журнале приёмки, и число из него берётся для витрины, а не пишется рукой. Так на странице оказывается ровно то, что показала машина.
Как эта ступень ловит подделку
Площадке довольно одного сравнения: ответ, не попавший ни на одну ступень, взялся не из браузера. Готовый браузер кладёт число на ступень, поэтому середина между ступенями это чужая рука. Проверить это у себя можно одной строкой в окне разработчика: прочитать предел кучи и посмотреть, попал ли он на одну из ступеней.
Ровно поэтому мы не округляем по-своему и не придумываем красивых чисел. Мы кладём ответ на ту же ступень, на которую положил бы его сам браузер. Профиль от этого выглядит обычным, а не аккуратным, и это здесь одно и то же.
Откуда взята таблица ступеней
Таблица взята из самого движка и лежит у нас файлом на сто строк. Первая ступень это десять миллионов байтов, последняя три миллиарда семьсот шестьдесят миллионов. Между ними девяносто девять полос, и ширина каждой своя.
Всё, что выше последней ступени, из таблицы не приходило. Если ваш браузер назвал число больше, он считал его сам, а не брал из этого ряда. Такое бывает на сборках, где заплата ещё не стоит.
Как прочитать своё
В браузере на 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, и таблица на ней кончается. Точный счёт бывает выше, и на сборке для Windows так и вышло.
- Меняется ли заявленная память от запуска к запуску?
- Нет. Она идёт от зерна профиля, поэтому один и тот же профиль отвечает одинаково на любой машине.
- Видит ли сайт, что значение поправили?
- Он читает одно обычное число и не видит, чем оно получено. Видит он другое: сходится ли это число с памятью, которую заявляет профиль.
- Меняет ли что-нибудь прокси?
- Нет. Адрес приходит со стороны, а это число рождается на машине перед вами.
Рядом с этим
Память устройства
Второе число о памяти, которое читает сайт, и чего оно стоит.
V8
Часть браузера, которая исполняет сценарии и держит кучу.
Что читает площадка
Весь набор ответов, который отдаёт один визит.
Движок, который мы собираем
Что правится внутри браузера, а не на странице.
Бесплатная проверка отпечатка
12 значений, прочитанных в вашем браузере, и ни одного запроса наружу.
Посмотрите свой отпечаток браузера
Проверка читает 12 значений в вашем браузере и не отправляет их никуда. Потолка кучи среди них нет.