Memory 如何识别;“空间很小”;原因

Memory 如何识别;“空间很小”;原因,memory,memory-leaks,pharo,Memory,Memory Leaks,Pharo,因此,有时您会在Pharo中看到“空间不足”对话框。有没有可能以某种方式确定是什么占用了这么多空间?这不是一个容易的问题,因为在收集信息的过程中,您可能会超出最大空间量 有一个SmalltalkImage>>lowSpaceThreshold,你可以修改它来获得更多的实验空间 您还可以查看SmalltalkImage>>记忆日志。该类变量将由VM(我认为)填充,其中包含最消耗内存的对象(如果可以识别这样的对象的话) 如果无法确定大型对象的单个实例,可以做的另一件事是查看所有类的所有实例的数量。这

因此,有时您会在Pharo中看到“空间不足”对话框。有没有可能以某种方式确定是什么占用了这么多空间?

这不是一个容易的问题,因为在收集信息的过程中,您可能会超出最大空间量

有一个
SmalltalkImage>>lowSpaceThreshold
,你可以修改它来获得更多的实验空间

您还可以查看
SmalltalkImage>>记忆日志
。该类变量将由VM(我认为)填充,其中包含最消耗内存的对象(如果可以识别这样的对象的话)

如果无法确定大型对象的单个实例,可以做的另一件事是查看所有类的所有实例的数量。这需要一些空间,你应该小心。但这里有一些代码可以工作(仅限于有趣的包):

然后,还有
TBehavior>>InstanceSizeInMemory
Object>>sizeInMemory
。如果您在图形上运行它们(您必须自己实现),它们确实会使您的图像崩溃,但它们可以很好地指示哪些对象消耗了多少内存

您可以将上面的代码改编为以下内容,以获得实例的大小:

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

注意:代码示例适用于Pharo4

这是一个一般性的问题,还是在特殊情况下发生的?还有,你有没有怀疑什么样的物体会占用太多的内存?@LeandroCaniglia是的,这是一般性的。因为我知道在这之前我已经预加载了哪个包,所以包的开发人员也应该有足够的知识来识别问题。但我开始想:好吧,如果一个不太高级的人犯了这个错误,他/她该怎么办?我要指出的是,可以避免创建中间集合(占用更多内存)通过使用
SystemNavigation来表示迭代,新的allObjectsDo:aBlock
其中
aBlock
是精心编写的,不会占用太多内存。没错。但是,您将访问每个对象,而不是只访问您感兴趣的对象,这意味着
过程
上下文
块闭包
小整数
等的实例。这些实例通常都是无趣的,但数量巨大。当然,block参数应该根据被怀疑的类等过滤掉不感兴趣的对象。
classes := Class allSubclasses select: [ :class | class name beginsWith: 'AB' ].
(classes collect: [ :class | class -> class instancesSizeInMemory ]) inspect.