1
25
我想你出了点问题。 首先,您的跟踪显示截断最后3位数字的总内存(因为您没有在代码中执行此操作,所以我认为这是因为textfield宽度)。它是这样增长的:3076、3092、3096等等。这些(大约)是千字节,而不是字节。然后你评论:“2小时后的总内存:3887104。我的上帝。现在,如果3887104的意思是3887104kb,大约是3.8GB。我怀疑是这样的,所以假设您的意思是3887104字节。大约3800 kb或3.8 MB。实际上,没有那么多内存,更重要的是,距离您最初的3076 KB也不远。 我认为这实际上误导了另一个海报,认为玩家的内存使用量增加了4字节,而实际上增加了4096字节,即4KB。 第二,即使代码非常简单,它也会消耗内存。对于初学者,每次发送enter_帧事件时,都会创建一个事件对象,该对象依次包含对其他对象、字符串等的引用。这需要记忆。然后将数字隐式转换为字符串(通过打印totalmemory)。无论您是否进行显式转换,这也需要内存(如果您进行跟踪而不是使用文本字段,则同样适用)。除此之外,从“动作脚本”的角度来看,肯定还有其他事情不明显。 现在,我认为问题的一部分在于你只是在追踪当前的总内存。看着它,它似乎一直在缓慢而稳定地成长。这是真的,但你可能会错过的是,以较慢的速度,GC启动并释放了大量已经积累的内存。 如果您修改代码来计算一些东西,这就更加明显了。
我使用4096字节的块作为单位(这就是为什么我要使用System.TotalMemory>>12)。只不过是一种说system.totalmemory/4096的奇特方式)。我认为它更易于管理,无论如何,总内存总是返回4096 byes或4kb的倍数。您可以在此处阅读有关Flash GC的更多信息: https://developer.mozilla.org/en/MMgc . 玩家的那部分是开放源码的,如果你愿意的话,你甚至可以阅读源码。 关于代码跟踪的简要说明:
现在,让我们看看使用此代码拍摄的一些“快照”。 这是一个早期快照,在SWF运行3秒钟后拍摄。请注意,电流读数为760。
大约10分钟后:
需要注意的几点:
现在,让主权财富基金运作更多的时间。运行50分钟后,快照如下:
此时,你可能认为有泄漏。请注意当前内存是931,而初始内存是760。 但是看看3124秒,大约52分钟后会发生什么:
在GC开始之前,峰值增长到962。但在那之后,电流又降到了767,非常接近最初的760。 所以,总结一下,内存使用量增长的事实并不一定意味着存在泄漏。您只需要处理这样一个事实:播放器是垃圾收集的,而这个过程是非确定性的。内存可能会在某个时刻被回收(当然,除非您的代码确实有漏洞)。你不能确定什么时候会发生这种情况。当玩家认为有必要时,就会发生这种情况。一般来说,玩家更清楚。 也就是说,我认为重要的是要注意代码中可能存在的泄漏。但仅仅跟踪system.totalmemory并不能帮助您确定这一点。如果可以的话,可以使用一个工具,比如flex builder的memory profiler,虽然它并不完美,但是可以提供更多有用的信息。在舞台上添加听众和使用计时器时要小心,造成内存泄漏的最大罪魁祸首是Flash播放器。 |
2
1
您可能需要检查运行的Flash播放器的版本。如果安装了IDE,那么在播放器的调试版本中运行的可能性相当大——与正常播放器相比,这种情况下释放内存的频率(如果有的话)几乎没有平时那么高。 如果在调试播放器中运行,则可以强制执行gc扫描-system.gc(); |
3
0
据我所知,在每个循环中,对system.totalmemory的调用返回一个uint,表示闪存当前使用的内存量(以字节为单位)。调用system.totalmemory返回的uint存储在内存中(即RAM,而不是标记为“memory”的文本字段)。然后更新memory.text引用以指向uint占用的内存空间。旧的uint仍在记忆中,但没有提到它。uint是32位(4字节)的数据,因此您可以看到内存占用每次增加4字节。一旦垃圾收集器运行,现在被取消绑定的uint所占用的内存空间将被释放,您将看到内存下降。 但是,当我运行示例代码时,我什么也没有得到。它会上下波动,不像你的那样总是上下波动,但我在OSX上,所以它是一个不同的玩家。 |
4
0
当文本字段中的文本更改时,flash必须将不同的字符加载到内存中以显示它们。这可以解释你得到的几百字节的增长。 别说了,脚印要大多少? 更新:经过考虑,我认为这是与临时位图图形,正在创建的闪存渲染文本…虽然你不希望有痕迹…尽管trace也必须做一些内部的事情… 你想过在flexbuilder中运行它吗?它有一个分析工具,可以告诉您内存的去向。 |
5
0
也许这很明显,但请记住System.TotalMemory提供了Flash播放器使用的内存量(静态)。如果您打开了其他闪存应用程序,这可能解释了为什么您的内存在增加。 |
Community wiki · 如何调试Python内存故障? 1 年前 |
tuskiomi · 如何为参考提供明确的锈蚀寿命? 2 年前 |
cobb208 · Malloc正在为释放指针引发错误 2 年前 |
mo FEAR · C++ STL映射是否在创建后移动了一个值的位置? 2 年前 |
Pooyanoss · 覆盖类的堆栈分配实例 2 年前 |
TheKing · 为什么数组的地址可以有负值? 2 年前 |
Http2inc · 如何从内存中解析这些二进制数据? 2 年前 |
tifrel · 如何检查已编译类型的表示形式? 2 年前 |
Gabriele · 释放GSL矩阵的正确方法是什么? 6 年前 |
Makogan · 3D纹理大小影响程序输出,不会引发错误 6 年前 |