Очистка памяти перед сборкой мусора?

Имел эту дискуссию с коллегой. когда языки, такие как C# или java-мусор, собирают объекты, такие как строки, возвращая их обратно в кучу, очищают ли они также этот блок памяти, например, перезаписывая 0 или 1?

я предполагаю, что блок возвращается как есть, если только один не использует классы, такие как securestring с перегрузкой finalize, для 0 из блока.

2 ответа

Решение

Практически нет, этого не происходит. Перезапись памяти, которую вы только что освободили, занимает много времени, поэтому существуют потери производительности. "Безопасные" объекты, такие как SecureString, просто стирают себя, не полагаясь на GC.

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

Чтобы взять ваш пример C#, спецификация C# не требует, чтобы объекты были перезаписаны после освобождения, и это также не запрещает это:

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

§3.9 C# 5.0 Спецификация языка

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

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

§5.2 C# 5.0 Спецификация языка

Кроме того, есть как минимум две реализации C# - реализация Microsoft и реализация Mono, так что просто сказать "C#" недостаточно конкретно. Каждая реализация может решить перезаписать память (или нет).

Насколько мне известно, нет ни одного сборщика мусора, который фактически стирает память с нулями или любым числом вообще. C# и Java сборщики мусора освобождают память от неиспользуемых объектов и помечают ее как доступную. SecureString вытирается при финализации, но это не GC.

Другие вопросы по тегам