Что такое закрепленные объекты?

Я пытаюсь найти утечку памяти с помощью профилировщика памяти муравьев, и я встретился в новом термине:

Закрепленные объекты.

Кто-то может дать мне хорошее и простое объяснение о том, чему это возражает, Как может я объекты pinn/Unpinn, и обнаруживать кто закрепленные объекты?

Спасибо

45
задан sagie 22 March 2010 в 09:01
поделиться

7 ответов

Прикрепленный объект - это объект, который не может перемещаться. Сборщик мусора обычно уплотняет память, перемещая все объекты в «один или несколько кластеров». Это необходимо для создания больших участков свободного пространства.

Это в основном означает, что если кто-то другой (извне) имеет указатель на адрес в памяти объекта, это может указывать на случайное содержимое - по мере того, как объект перемещается.

Закрепление объекта указывает сборщику мусора НЕ ПЕРЕМЕЩАТЬ ЭТО. Обычно это бесполезно и имеет смысл ТОЛЬКО при работе с указателями - например, при использовании PInvoke. Иногда вам нужно превратить адрес в структуру (в термине макета памяти), и если это реализовано в классе, вы должны закрепить это.

Чтобы ответить конкретно:

  • Вы не можете узнать, кто прикрепил объект.
  • Закрепление выполняется с помощью оператора FIXED. Это разрешено только в небезопасном коде.

Проверить:

http://msdn.microsoft.com/en-us/library/f58wzh21%28VS.80%29.aspx

52
ответ дан 26 November 2019 в 21:09
поделиться

Закрепленный объект тот, который имеет установленное место в памяти.

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

Их можно создать с помощью оператора fixed : http://msdn.microsoft.com/en-us/library/f58wzh21%28VS.80%29. aspx

4
ответ дан 26 November 2019 в 21:09
поделиться

Причина, по которой вы можете закрепить объект, - это вызовы неуправляемого кода.

При запуске сборщика мусора он может удалить объект, который больше не нужен. В результате в куче остается «дыра» свободного места. Затем GC сжимает кучу, перемещая оставшиеся объекты вместе, чтобы убедиться, что свободное пространство находится в одном непрерывном блоке (что-то вроде дефрагментации жесткого диска).

Он также обновляет все ссылки (в управляемом коде) на любые объекты, которые были перемещены как часть сжатия.

Если вы работаете с неуправляемым кодом (например, с каким-то внешним C ++) и даете ему указатель на объект, сборщик мусора не может сообщить неуправляемому коду, что объект переместился после его запуска. Поэтому вы можете пометить объект, которым вы делитесь, с помощью внешнего кода как закрепленный, чтобы у вас не возникало проблемы с недействительным указателем.

6
ответ дан 26 November 2019 в 21:09
поделиться

Для фиксации объектов можно использовать ключевое слово fixed:

Оператор fixed предотвращает перемещение объекта сборщиком мусора. сборщик мусора не позволяет перемещать перемещаемую переменную. Оператор fixed разрешено только в небезопасном контексте.

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

Решением для нас стало использование класса BitConverter. Если вы посмотрите на основной код класса BitConverter, то увидите, что он использует ключевое слово fixed для фиксации массива байтов при получении байтов из переменной.

5
ответ дан 26 November 2019 в 21:09
поделиться

Прикрепленный объект - это объект, который не может быть перемещен сборщиком мусора, то есть его адрес должен оставаться неизменным, потому что кто-то другой, обычно часть неуправляемого кода, зависит от того, что объект находится по определенному адресу памяти.

Обычно сборщик мусора имеет право перемещать объекты в памяти. В управляемом коде, поскольку сборщик мусора имеет возможность доступа ко всем ссылкам, он может свободно переместить объект в другое место и затем обновить все ссылки на этот объект так, чтобы этот процесс был прозрачен для работающего кода. Таким образом, GC имеет возможность лучше организовать память программы и при необходимости уплотнить ее.

Когда неуправляемый объект взаимодействует с вашим кодом (в небезопасных секциях), может возникнуть ситуация, когда где-то есть указатель на часть вашего кода - например, на часть памяти, адресуемую в вашем коде, которая обрабатывается внешним вызовом COM. Эта память не может быть перемещена, потому что вызов COM ожидает, что объект будет находиться по заданному адресу, и поэтому, если бы он был перемещен, у GC не было бы способа уведомить объект COM об этом изменении, что привело бы к нарушению доступа или еще хуже.

19
ответ дан 26 November 2019 в 21:09
поделиться

Закрепленные объекты используются при взаимодействии с неуправляемым кодом. В управляемом коде сборщик мусора может свободно перемещать блоки памяти, поскольку он знает обо всех ссылках на блок памяти и может соответствующим образом их обновлять.

При взаимодействии с неуправляемым кодом (например, Win-API) указатели на данные или буферы часто передаются в качестве аргументов. Если бы сборщик мусора мог перемещать эти данные, указатели внезапно стали бы недействительными. Поскольку указатель передается в неуправляемый код, сборщик мусора не может обновить указатель - или даже узнать, где он используется. Чтобы предотвратить перемещение памяти и убедиться, что данные остаются в месте, известном указателю неуправляемого кода, объект может быть закреплен .

6
ответ дан 26 November 2019 в 21:09
поделиться

получил это от msdn «Закрепленный объект - это объект, который сборщик мусора не может переместить в память»

http://msdn.microsoft.com/en-us/library/x2tyfybc (VS. 71) .aspx

2
ответ дан 26 November 2019 в 21:09
поделиться
Другие вопросы по тегам:

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