Неверный размер родной нити [дубликат]

Многие, если не все, другие ответы здесь подходят для небольших наборов данных. Для масштабирования требуется больше внимания. См. здесь .

В нем обсуждается несколько более быстрых способов делать групповые макс и верхние N на группу.

19
задан Dave L. 1 July 2015 в 23:36
поделиться

1 ответ

Я начинаю подозревать, что стекная память (в отличие от кучи JVM), кажется, предварительно объявлена, не становясь резидентной, и со временем становится резидентной только с высокой отметкой о фактическом использовании стека.

< / blockquote>

Да, malloc / mmap ленив, если не указано иное. Страницы поддерживаются только физической памятью после их доступа.

Память GC heap эффективно затрагивается копирующим сборником или путем предварительного обнуления (-XX:+AlwaysPreTouch), поэтому он всегда будет резидентным.

Для дальнейшего подтверждения вы можете использовать pmap -x <java pid> и перекрестно ссылаться на RSS различных диапазонов адресов с выходом из карты виртуальной памяти из NMT. ​​


Зарезервированная память была смоделирована с помощью PROT_NONE. Это означает, что диапазоны виртуального адресного пространства содержат записи в vma-структурах ядра и, следовательно, не будут использоваться другими вызовами mmap / malloc. Но они все равно будут вызывать ошибки страниц, передаваемые процессу в виде SIGSEGV, т. Е. Доступ к ним является ошибкой.

Это важно иметь смежные диапазоны адресов для будущего использования, что, в свою очередь, упрощает арифметику указателя.

Память с фиксированной, но не поддерживаемой памятью была сопоставлена ​​- например, PROT_READ | PROT_WRITE, но доступ к ней все еще вызывает ошибку страницы. Но эта ошибка страницы бесшумно обрабатывается ядром, поддерживая его с реальной памятью и возвращаясь к исполнению, как будто ничего не произошло. То есть это детализация / оптимизация реализации, которые не будут замечены самим процессом.


Чтобы дать разбивку понятий:

Используемая куча: объем занимаемой памяти по живым объектам в соответствии с последним GC

Committed: Диапазоны адресов, которые были сопоставлены с чем-то иным, чем PROT_NONE. Они могут или не могут поддерживаться физическим или свопом из-за ленивого выделения и пейджинга.

Зарезервировано: полный диапазон адресов, который был предварительно отображен с помощью mmap для определенного пула памяти. Разница с зарезервированным состоит из PROT_NONE сопоставлений, которые, как гарантируется, не будут поддерживаться физической памятью

Резидент: страницы, которые в настоящее время находятся в физической памяти. Это означает, что код, стеки, часть выделенных пулов памяти, а также части файлов mmaped, которые недавно были доступны, и распределения вне контроля JVM.

Virtual: сумма всех сопоставлений виртуальных адресов. Обложки, зарезервированные пулы памяти, а также сопоставленные файлы или разделяемая память. Этот номер редко информативен, поскольку JVM может резервировать очень большие диапазоны адресов заранее или большие файлы mmap.

20
ответ дан the8472 28 August 2018 в 08:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: