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