memory - 如何识别 "Space is low"原因

标签 memory memory-leaks pharo

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

最佳答案

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

您可以修改 SmalltalkImage>>lowSpaceThreshold 以获得更多的实验空间。

您还可以查看SmalltalkImage>>memoryHogs。该类变量将由虚拟机(我认为)使用顶级内存消耗对象(如果可以识别这样的对象)来填充。

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

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

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

您可以将上面的代码修改为以下代码来获取实例的大小:

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

注意:代码示例适用于 Pharo4。

关于memory - 如何识别 "Space is low"原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28657762/

相关文章:

Android OutOfMemoryError 位图大小超出 VM 预算

arrays - char *array 和 char array[] 之间的内存区别是什么?

android - 跟踪 Android 中的内存/窗口泄漏?

c++ - 如何解释或缩小此视觉泄漏检测器输出中内存泄漏的原因?

iphone - 解析 xml 时 NSCFString appendString 泄漏

具有多个参数的 Pharo 方法

smalltalk - Smalltalk的VT100屏幕抓取界面

java - Docker - Java 容器不遵守内存限制

java - 堆大小限制

smalltalk - 如何在 Pharo 中对字符串进行驼峰命名?