Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.05.2010, 21:40
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 21  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Народ, вы путаете несколько близких понятий.
- объекты создаются и их создание отбирает какой-то объем памяти, визуально это можно представить как:
[объект][объект]...[объект]... (и так пока не упремся в максимальный размер памяти отведенный нашей программе). На самом деле не совсем максимальный, извесные мне виртуальные машины (.NET и Java) разделяют память на 2 части - молодое поколение и старое поколение. Естественно, когда мы создаем объект он попадает в молодое поколение, и, если доживает, то его потом переносят в старое поколение.
Мусорщик, это отдельный процесс, который спит пока не наступит одно из трех событий:
- его насильно разбудят.
- процесс который следит за объемом памяти обнаружит, что памяти в целом не хватает.
- процесс который следит за объемом памяти обнаружит, что в старом поколении не хватает места. (Следовательно, чем меньше места есть для старого поколения, тем чаще будет включатся мусорщик).
Что делает мусорщик:
- проверяет, что "корневые ссылки" еще живы и формирует таблицу из живых ссылок.
- проходится по всем оставшимся ссылкам и удаляет все, на что не ссылаются "живые" корневые ссылки (переменные объявленные внутри функции тоже являются корневыми ссылками).
- дальше наступает самый реурсоемкий процесс - "утрамбовка" памяти. Т.е. объекты, которые мы только что удалили, скорее всего не будут стоять один за другим, это значит, что нам нужно каким-то образом из ситуации:
[объект][удаленный объект][объект][удаленный объект][объект]...[объект]...
прийти к ситуации:
[объект][объект][объект]...[объект]...
И обновить поинтеры на перенесенные объекты.
Как именно объекты располагаются в памяти, и на сколько плотно мусорщик ее "утрамбовывает" я не знаю, дело это темное, и вообще мы можем только догадываться Но это не значит, что если вы будете создавать кучу объектов в функции без внешних ссылок, то мусорщик не запустится - конечно запустится, а куда же ему деться, память ведь замусорилась. Так же нет повода предполагать, что мусорщик включится после каждого вызова любой функции чтобы сделать свое черное дело - ну, долгий это процесс и нет смысла его будить каждый раз, особенно, если памяти еще навалом.
__________________
Hell is the possibility of sanity

Старый 15.05.2010, 21:54
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 22  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Спасибо что разьяснил. Но ведь тогда это расходится со словами BlooDHounD, он говорил что локальные переменные не имеют вообще времени жизни и всё пишется прям поверх них, причём сразу. А ты говоришь
Цитата:
Но это не значит, что если вы будете создавать кучу объектов в функции без внешних ссылок, то мусорщик не запустится - конечно запустится, а куда же ему деться, память ведь замусорилась.
Наверное, мне нужно протрезветь, чтобы понять.

Старый 15.05.2010, 22:59
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 23  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Ну, как бы чудес не бывает, если нужно создать объект, то для этого нужна память. Что правда, так это то, что ссылок на объекты созданые во время выполнения функции после того, как функция отработает не должно остаться (при условии, что на них нету других ссылок). Но очень сомнительно, что они прям моментально удалятся из памяти, это долгий и ресурсоемкий процесс, ну не поверю я, что мусорщик будет вызываться после каждой функции.
__________________
Hell is the possibility of sanity

Старый 15.05.2010, 23:06
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 24  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Дак Блуд говорит о том, что когда отработала функция - все локальные переменные пишутся в какой-то области памяти. Дак как только вот когда метод отработал - память пометилась как "свободная" и мусорщик к ней притронутся не должен, просто лепим поверх них ещё новую память. То есть как будто бы в ней ничего и никогда не было. Ну, это конечно если я правильно его понимаю.

Старый 15.05.2010, 23:27
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 25  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
ммм... ну вот как ты себе представляешь моментальное уничтожение такого объекта:
Код AS3:
function foo():Object { return { }; }
var bar:Object = foo();
С какой стати объект созданный в этой функции должен удалиться?
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 15.05.2010 в 23:30.
Старый 15.05.2010, 23:43
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 26  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Но это же внешняя ссылка)) Объект видимо переносится в кучу))
Ты бы еще привел в пример создание новых дисплейных объектов и их помещение на стейдже без сохранения ссылок вовне - было бы еще красивее)))) Но речь все же шла о локальных переменных функции. Я тоже не думаю, что ИМИ занимается GC. Там должен быть свой, более примитивный механизм.
__________________
Reality.getBounds(this);

Старый 16.05.2010, 01:11
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 27  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
ОК, давайте посмотрим на вопрос по другому, во время работы програмы вы можете создать объект где-нибудь за пределами функции? - очевидно, нет. Делать какие-то переносы в памяти каждый раз после вызова функции - это безумное расточительство. Т.е. запускать мусорщика нет смысла после каждой функции. Т.е. логичнее всего не делать никаких сортировок во время выделения памяти, а просто добавлять в конец списка, и время от времени просматривать список и убирать ненужное. С другой стороны представьте вот такую диллему:
Код AS3:
function foo(x:Number):Function
{
    return function():Number { return x * x; };
}
Функция отработала, а ссылка осталась. ОК, такой вариант в принципе можно предусмотреть, а вот такой:
Код AS3:
function foo(x:Number):Number
{
    var y:Numer = x * x;
    if (y < 36) throw y;
    return y;
}
И вот теперь вопрос - удалять y или не надо? или нужно проанализировать весь стек вызова, найти, а поймает ли кто-нибудь эту ошибку и только потом принять решение? Как бы нет никакого смысла пытаться не записать у, гораздо проще и быстрее записать и забыть. А если места будет потом не хватать, то его все равно потом найдут и удалят.
__________________
Hell is the possibility of sanity


Последний раз редактировалось wvxvw; 16.05.2010 в 01:14.
Старый 16.05.2010, 02:25
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 28  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Всё те же выбросы объекта из локальной видимости наружу. Все эти return, throw, addChild - передают значение наружу другому объекту (или функции).
Впрочем, может ты и прав, и реальные локальные переменные записываются в общую кучу и живут там до рейда GC, а получить их мы не можем просто потому что уже нет ссылки на эту область памяти))) Можно проверить, насоздавав тонну локальных переменных в цикле))
__________________
Reality.getBounds(this);

Старый 16.05.2010, 02:30
BlooDHounD вне форума Посмотреть профиль Отправить личное сообщение для BlooDHounD Посетить домашнюю страницу BlooDHounD Найти все сообщения от BlooDHounD
  № 29  
Ответить с цитированием
BlooDHounD
стервочка (я мужик)
 
Аватар для BlooDHounD

блогер
Регистрация: Mar 2004
Адрес: Борисов
Сообщений: 3,161
Записей в блоге: 22
Psycho Tiger, не верь мне. я тоже иногда ошибаюсь. тут я бы поделил мою и Олега правду по палам.

@Олег, тут выше сказали, что есть понятие стэк. представим, что у нас есть временное хранилище ссылок, для стэка. так как нам заведомо известно, что стэк всегда заканчивается ( то есть не может вечно исполняться ), то мы запускаем проверку только для стэка. всё, на что остались ссылки из кучи, помещаем в кучу.
если в куче не осталось места, запускаем GC. мне кажется это вкладывается и в твою и в мою теорию =) а временную память для стэка можно не чистить. можно всегда писать поверх. у нас нет многопоточности, а значит не может быть обращений левых.

Старый 16.05.2010, 04:05
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 30  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Сорь, ты сам понял, чего сказал? Как это стек будет исполнятся? Стек это безразмерный массив, или назови это таблицей с неограниченым числом записей. Какое временное хранилище? Есть таблица в которой хранятся поинтеры и есть стек, на участки в котором они указывают... Или ты про стек вызова? Если да, то какое он имеет отношение к очистке памяти? Т.е. в стек вызова попадает только скомпилированый код, что этот код создает туда не должно попадать. Т.е. если ты написал функцию, то когда ты ее запустишь, она загрузится в стек вызовов (добавит свой стек-фрейм(ы)), а уже чего она создаст - это в память, ты не можешь на ходу модифицировать стек-фрейм... стек фрейм - это часть програмы (кстати, в Лиспе можно это модифицировать, т.е. этот язык позволяет на ходу переписывать саму програму, но в AS3 такое как бы не предусмотрено )
Как правило, стек фрейм состоит ис трех частей - активация (параметры переданые функции, создание контекста, если нужно), дальше локальные действия, такие как объявление (создание переменных), дальше - точка выхода. Обрати внимание, что в стеке вызова создаются только переменные, их значения - это уже совсем другое место.
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 23:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:30.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.