Многие, если не все, другие ответы здесь подходят для небольших наборов данных. Для масштабирования требуется больше внимания. См. здесь .
В нем обсуждается несколько более быстрых способов делать групповые макс и верхние N на группу.
Я начинаю подозревать, что стекная память (в отличие от кучи 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.