Как новый оператор выделяет кучу памяти? - PullRequest
1 голос
/ 16 июля 2010
private button btnNew=new button();
btnNew.addclickhandler(this);
private DataGrid grid;
private void onClick(event click) {grid=new DataGrid();}

Здравствуйте, я пишу код, подобный этому примеру, я хочу знать, что каждый раз, когда пользователь нажимает на btnNew, что происходит в памяти кучи и стека?this grid ? Или удалить старый блок и заменить его новым блоком? Или более старый блок остается в памяти кучи, а также назначить ему новый блок.огромная память на несколько кликов?** DataGrid можно заменить любым компонентом, который я хочу знать об этом типе использования новых операторов и распределении памяти ** извините, за мой плохой английский!

Ответы [ 4 ]

4 голосов
/ 16 июля 2010

что происходит с памятью кучи и стека?

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

Назначен ли этой кнопке новый блок в памяти кучи?

да, если память доступна, в противном случае недостигнутые ссылки будут удалены, и этот будет выделен

Распределяет ли этот блок кода большой объем памяти одним щелчком мыши?

Нет, но это произойдет, если вы добавите тысячи кнопок

Ознакомьтесь с этой классной статьей Память в .NET - что идет куда от Джон Скит , чтобы лучше понять внутренности памяти ..

Приветствия

2 голосов
/ 16 июля 2010

Это огромная тема.Это похоже на вопрос: «Вы вводите www.amazon.com в браузер. Что будет дальше?»Чтобы полностью ответить на этот вопрос, вы должны объяснить архитектуру всего Интернета .Чтобы полностью ответить на ваш вопрос, вы должны понимать всю модель памяти современной операционной системы.

Начните с изучения основ памяти и сборки мусора здесь:

http://msdn.microsoft.com/en-us/library/ee787088.aspx

, а затем задайте более конкретные вопросы о вещах, которые вы не понимаете.

0 голосов
/ 16 июля 2010

если кнопка является классом (тип ссылки), она размещается в куче.(типы значений выделяются в стеке в текущей реализации CLR, если только они не содержатся в другом ссылочном типе или не записываются в замыкание - в этом случае они находятся в куче.)предварительно выделенные сегменты памяти разных размеров, соответствующие поколениям 0, 1 и 2. Когда вы создаете новый объект, он выделяется в поколении 0. И это распределение действительно быстрое, поскольку он просто перемещает указатель с помощью дельты =размер объекта.CLR очищает значения в объекте до значений по умолчанию в качестве предварительного шага перед выполнением ctor.

Периодически все потоки приостанавливаются и запускается сборщик мусора.Он создает график достижимых объектов путем обхода «корней».Все недоступные объекты отбрасываются.Сегменты генерации перемещаются / уплотняются, чтобы избежать фрагментации.Gen 0 собирается чаще, чем 1 и т. Д. (Поскольку объекты Gen-0, вероятно, являются недолговечными объектами).После сбора возобновляются потоки приложения.

Подробнее об этом см. В документах, объясняющих сборщик мусора и поколения.Вот один .

0 голосов
/ 16 июля 2010

Использование оператора new выделяет память в куче.Вообще новая память выделяется.Если указатель btnNew был единственным указателем, связанным с объектом кнопки, он должен стать целью для сборщика мусора.Так что память снова будет освобождена.Для нескольких кликов произойдет то же самое, но вы должны знать, что сборщик мусора не работает в реальном времени.Так что в высокочастотном цикле выделения больших объектов - «новый» может стать проблемой в c #.

...