我正在尝试调试客户端的一系列问题,这些问题似乎与我们的 Web 应用程序面临内存泄漏问题。在录制了一个简单地反复浏览我们的 Web 应用程序的宏脚本后,我们发现随着时间的推移,所有主流浏览器都会消耗越来越多的内存,这会导致 flash 和 javascript 等许多内存不足的问题。Internet explorer 是需要内存的最大罪魁祸首在 25 分钟内提交近 1.5 GB。我们的网络应用程序大量使用闪存,从我的研究来看,这也是一个很大的内存泄漏cuprit。说了这么多,我的问题是什么主要负责内存管理?我知道浏览器负责释放和占用进程级别的内存,但是如果我们观察到持续使用的内存泄漏,我们应该关注什么来解决这个问题?
1 回答
您需要澄清几件事。如果问题似乎与 Flash 有关,您是重新加载包含 Flash 小程序的整个页面还是继续使用它?
如果您重新加载它 - 问题可能出在 JavaScript 方面,其中一些对 Flash 对象的 JavaScript 引用在查看单个页面的会话中持续存在(这很少见但并非不可能,在某些时候 Skype 会导致其覆盖层出现此类问题对于可调用的电话号码,它们在 ExternalInterface 包装器中弄乱了一些东西,不仅导致它们自己,而且包含 Flash 的每个页面都永远保留在浏览器的内存中)。
Flash小程序,如果你不重新加载它,它应该自己管理自己的内存,浏览器,插件包装器,甚至播放器都不负责。但是,Flash 使用类似于 Java 的内存管理模型,这意味着它在技术上无法分配应用程序关闭后不会回收的内存,这意味着如果您确保重新加载 Flash 小程序,那么即使小程序本身是泄漏,在它被卸载后,它使用的所有内存都应该被回收。
一般来说,AS3 使用更高级的编程,与 JavaScript 相比,它更多,所以,我会开始寻找那里的问题(因为在更复杂的代码中出错的可能性更大)。Flash 有几个可用的内存分析器。Flash Builder 中有一个,FlashDevelop 也有一个,还有一个已知不绑定到任何 IDE:http: //jpauclair.net/2012/07/11/new-tutorial-profiling-memory-with-theminer/ 还有一个一个名为 Monocle(以前是 Telemetry)的项目,我不确定它是否已经发布,但 Adobe 在上一次 MAX 活动中展示了它,这里有一位 Adobe 工程师在谈论它:https://adobechats.adobeconnect .com/_a200985228/p4khwz03sz9/?launcher=false&fcsContent=true&pbMode=normal(更接近演示文稿的中间)。
至于 JavaScript,这是我前段时间遇到的:https ://wiki.mozilla.org/Performance%3aLeak_Tools来自 Mozilla 的建议。但是,我还记得需要从源代码构建 Mozilla 浏览器以启用内存分析(如果这样做,您需要设置一些与分析器输出相关的变量)。以下是 Chrome 上的类似信息:http: //zetafleet.com/blog/google-chromes-heap-profiler-and-memory-timeline。也许,Visual Studio 中有一些工具可以在 IE 中分析 JavaScript - 我不知道。