所以有时在Pharo中会出现"Space is low"对话框。有可能以某种方式确定是什么占据了这么多空间吗?
这不是一个容易的问题,因为在收集信息的过程中,您可能会超出最大空间量。
有一个SmalltalkImage>>lowSpaceThreshold
,你可以修改它来获得更多的实验空间。
您还可以查看SmalltalkImage>>memoryHogs
。该类变量将由VM(我认为)填充,其中包含最消耗内存的对象(如果可以识别这样的对象)。
如果无法精确定位大型对象的单个实例,可以做的另一件事是查看所有类的所有实例的数量。这需要一点空间,你应该小心。但这里有一些代码可以工作(仅限于有趣的包):
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。