Когда должен я избавляться от контекста данных

Я начинаю подозревать, что стекная память (в отличие от кучи 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.

55
задан Mykroft 23 December 2008 в 20:01
поделиться

3 ответа

Это на самом деле не имеет значения слишком много. Я спросил Matt Warren от LINQ до команды SQL об этом только что, и здесь являюсь ответом:

существует несколько причин, мы реализовали IDisposable:

, Если прикладная логика должна содержать на объект вне того, когда DataContext, как ожидают, будет использоваться или допустимый, можно осуществить тот контракт вызовом, Располагают. Задержанные загрузчики в том объекте будут все еще ссылаться на DataContext и попытаются использовать его, если какой-либо код попытается переместиться по задержанным свойствам. Эти попытки перестанут работать. Расположите также вынуждает DataContext вывести свой кэш осуществленных объектов так, чтобы единственный кэшируемый объект случайно не поддерживал все объекты, осуществленные через, что DataContext, который иначе вызвал бы, что, кажется, утечка памяти.

логика, которая автоматически закрывает соединение DataContext, может быть обманута в отъезд открытого соединения. DataContext полагается на код приложения, перечисляющий все результаты запроса начиная с получения до конца триггеров набора результатов соединение с завершением. Если приложение использует метод MoveNext IENUMERABLE вместо foreach оператора в C# или VB, можно выйти из перечисления преждевременно. Если Ваше приложение испытывает проблемы с соединениями, не закрывающимися, и Вы подозреваете, что автоматическое заключительное поведение не работает, можно использовать Расположить шаблон в качестве работы вокруг.

, Но в основном Вы не делаете действительно потребность избавиться от них в большинстве случаев - и это дизайном. Я лично предпочитаю делать так же так или иначе, как легче следовать, правило "избавляются от всего, что реализует IDisposable", чем помнить загрузку исключений к нему - но Вы вряд ли пропустите ресурс, если Вы сделаете , забывают избавляться от него.

67
ответ дан Jon Skeet 7 November 2019 в 17:23
поделиться

DataContext довольно легок и предназначается для приложения единицы работы, поскольку Вы используете его. Я не думаю, что сохранил бы DataContext в своем объекте, как бы то ни было. Вы могли бы хотеть посмотреть на шаблоны репозитория, если Вы не собираетесь использовать сгенерированный код разработчика для управления бизнес-объектами. Шаблон репозитория позволит Вам работать со своими объектами, отсоединенными от контекста данных, затем повторно прикрепит их прежде, чем сделать обновления, и т.д.

Лично, я в состоянии жить со сгенерированным кодом разработчика DBML по большей части с частичными реализациями класса для моего бизнеса и логики проверки. Я также делаю сгенерированный разработчиками краткий обзор контекста данных и наследовался ему, чтобы позволить мне прерывать вещи как хранимая процедура и табличные функциональные методы, которые добавляются непосредственно к контексту данных и применяют бизнес-логику там.

шаблон А, что я использовал в ASP.NET MVC, должен ввести класс фабрики, который создает соответствующие контексты данных по мере необходимости для единиц работы. Используя фабрику позволяет мне дразнить контекст данных, довольно легкий путем (1) использования обертки вокруг существующего класса контекста данных так, чтобы это было mockable (дразните обертку, так как DataContext не легко mockable), и (2) создания Поддельных/Ложных контекстов и фабрик для создания их. Способность создать их по желанию из фабрики делает его так, чтобы я не имел в наличии один в течение долгих промежутков времени.

5
ответ дан tvanfosson 7 November 2019 в 17:23
поделиться

Рассматривайте свой datacontext как ресурс. И в правиле использования ресурса говорится

, "получают ресурс уже в возможном, выпускают его как только его сейф"

16
ответ дан Perpetualcoder 7 November 2019 в 17:23
поделиться
Другие вопросы по тегам:

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