2015-02-22 2 views
2

Так что иногда вы получаете диалоговое окно «Space is low» в Pharo. Можно ли как-то определить, что занимает много места?Как определить, что «Пробел низкий» вызывает

+0

Это общий вопрос, или это случается с вами при особых обстоятельствах? Кроме того, есть ли у вас подозрения в том, какие объекты могут занимать слишком много памяти? –

+0

@LeandroCaniglia да, это вообще. Потому что я знаю, какой пакет я предварительно загрузил до того, как это началось, поэтому разработчик пакета также должен обладать достаточными знаниями для выявления проблемы. Но я начал думать: хорошо, кто-то не настолько продвинутый получает эту ошибку, что он должен делать? – Uko

ответ

2

Это непростая проблема, потому что в процессе сбора этой информации вы, вероятно, превысите максимальный объем пространства.

SmalltalkImage>>lowSpaceThreshold, который вы можете изменить, чтобы получить немного больше места для экспериментов.

Что вы также можете сделать, это посмотреть на SmalltalkImage>>memoryHogs. Эта переменная класса будет заполнена виртуальной машиной (я думаю) с помощью объектов, потребляющих верхнюю память (если такой объект может быть идентифицирован).

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

classes := Class allSubclasses select: [ :class | class name beginsWith: 'AB' ]. 
(classes collect: [ :class | class -> class allInstances size ]) inspect. 

Тогда, есть также TBehavior>>instancesSizeInMemory и Object>>sizeInMemory. Это может привести к краху вашего изображения, если вы запустите их на графике (вам придется реализовать это самостоятельно), но они дают вам хорошее представление о том, какие объекты потребляют сколько памяти.

Вы можете адаптировать код сверху следующее, чтобы получить размер экземпляров:

classes := Class allSubclasses select: [ :class | class name beginsWith: 'AB' ]. 
(classes collect: [ :class | class -> class instancesSizeInMemory ]) inspect. 

Примечание: примеры кода предназначены для Pharo4.

+0

Я хотел бы указать, что можно избежать создания промежуточных коллекций (которые занимают еще больше памяти), выражая итерации с помощью «SystemNavigation new allObjectsDo: aBlock», где 'aBlock' тщательно написан, чтобы не занять много памяти. –

+0

Это правда. Тем не менее, вы будете посещать * каждый * объект, а не только те, которые вам интересны, что означает экземпляры 'Process',' Context', 'BlockClosure',' SmallInteger' и т. Д., Которые обычно неинтересны, но из которых суммы. –

+0

Несомненно, аргумент блока должен отфильтровывать неинтересные объекты на основе подозрительных классов и т. Д. –

Смежные вопросы