- 浏览: 584229 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (237)
- Java (48)
- Flex3 (43)
- Spring (7)
- Hibernate (7)
- 杂文 (2)
- 设计模式 (3)
- 数据库相关 (32)
- Eclipse开发环境 (10)
- C/C++ (1)
- 随笔 (1)
- 生活点滴 (2)
- Flex4 (3)
- Oracle (6)
- SQLServer (6)
- Degrafa (1)
- ActionScript (2)
- JavaScript (11)
- MySQL (8)
- 开源项目 (4)
- AspectJ (0)
- Spring Security (1)
- SSO (0)
- PV3D (2)
- JBPM (1)
- JBoss (0)
- Tomcat (5)
- Struts (1)
- WebService (2)
- 算法 (1)
- 数据结构 (1)
- POI (2)
- Lucene (2)
- 其他 (3)
- Blazeds (2)
- Alternative 3D (0)
- Ibatis (3)
- Intellij (3)
- freemaker (0)
- Maven (5)
- web (4)
- Eclipse (1)
- velocity (1)
- Linux (7)
- CXF (3)
- html (2)
- JVM (1)
最新评论
-
jpsb:
多谢楼主,问题解决,主要就是svn版本不同导致的
Eclipse 导入本地svn项目的问题 -
yycdaizi:
lanmolsz 写道无法同意楼主的说法,楼主所谓的晚捕捉就是 ...
Java异常处理原则 -
lanmolsz:
无法同意楼主的说法,楼主所谓的晚捕捉就是典型的让异常控制程序的 ...
Java异常处理原则 -
cici_new_1987:
...
Java异常处理原则 -
雁行:
倒是怀疑这个功能来着
Eclipse 导入本地svn项目的问题
文章收集:
http://spreadingfunkyness.com/garbage-collection-with-flex-and-adobe-air/
I finally found some spare time to organize the stuff presented at flexcamp and make it a blog post. I “argue” with the Flex profiler almost daily and we had an “intense” relationship the month right before the flexcamp. So I felt a talk about profiling and Garbage Collection (GC) was really fit. Right, it is impossible to decouple profiling from GC. If you want to improve the memory management of your application you have to know how the Flash Player (and Adobe Air) manage memory allocation and deallocation.
Let me start by saying there are many blog posts about issues related to GC and profiling, ranging from documentation, presentations, how-tos, etc. I list them at the bottom.
The present post can be considered useful to beginners and medium experienced people which use Flex almost daily and have the need to optimize memory consumption. After introducing the fundamental concepts I will list a set of lessons learned during the development of Posty and Focused. I will particularly focus on the use of renderers’ caches.
Virtual Machine (VM)
The flash player is based on a virtual machine (to be precise the machines are 2, one for actionscript2 and one for actionscript3). VMs dynamically allocate memory when you create new objects. For example the following line of code creates a new Object.
1
|
var o:Object = new Object()
|
At startup the VM reserves some memory and when the code above is executed decides where the object goes in the application memory and how much space it takes. As you create objects the VM might use all the memory allocated at startup and, when needed, requests some more to the operative system. Unless you have a program which nonsensically just creates new objects, there will be some time during the execution when an object becomes “useless”, e.g. it is not needed anymore for the correct execution of the program. You’ll see that it is not easy to “understand” when an object is not needed. For now let’s assume we are able to detect it.
In the Flash VM achitecture you cannot explicitly say “delete it”. Memory usage is managed, that is the VM itself is responsible to check which objects are useless and delete them. Such a mechanism is called Garbage Collection.
Garbage Collection
So what can I do as a programmer? Well, you can ease the task of the garbage collector. Let’s see what we expect to happen with the help of a figure.
At startup the application reserves some memory to be used, say four blocks. When you create a new object the VM allocates it using the first slot. Let’s say that after a while o1
is not needed anymore and you set it to null. When you create a new object, o2
, you expect that it takes the place of o1
. Sometimes it happens, sometimes it does not. This depends on the garbage collection mechanism, which is a pretty complex procedure we are not describing here (a good article has been written by Grant Skinner).
At this point we already have a lesson learned: “setting an object to null does not necessarily free the memory it was occupying“.
This depends on the way GC has been implemented in flash. GC is triggered by allocation” and not deletion. This means that the GC cycle is run when you say new Object() and not when you set it to null.
Memory Consumption
If you have to do with AS3 and Flex you probably know that you can dynamically add UI elements to the graphical interface via a simple method called addChild()
. The opposite method is removeChild()
, which removes a display element from the UI. To be more precise, the element is deleted from the view (it is not displayed anymore) but this does not mean it has been garbage collected. Let me introduce you to a simple scenario to show you easy is to put too much trust in the removeChild()
method.
Many Flex applications load data from a server and display it dynamically, according to the values returned. Usually the view code is isolated in a component, often referred to as renderer, which is responsible of showing the data loaded from the server. We devise a very simple renderer that is made of two text fields, embedded in a VBox. Data shown are field1
and field2
, properties of the object provided as input.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
borderStyle="solid" width="200"
>
<mx:Script>
<![CDATA[
[Bindable] private var _field1:String;
[Bindable] private var _field2:String;
override public function set data(value:Object):void {
_field1 = value.field1;
_field2 = value.field2;
}
]]>
</mx:Script>
<mx:Text text="{_field1}" />
<mx:Text text="{_field2}" />
</mx:VBox>
|
Let’s simulate data loading by means of a simple function, which returns an array of objects.
1
2
3
4
5
6
7
8
9
10
11
|
private function getData():Array {
var a:Array = new Array();
for (var i:uint = 0; i< 200; i++) {
var o:Object = new Object();
o.field1 = "field "+Math.random().toString();
o.field2 = "field "+Math.random().toString();
a.push(o);
}
return a;
}
|
To render data we use a simple function which creates a renderer, sets its data, and adds it to the VBox.
1
2
3
4
5
6
7
8
9
10
11
|
private function loadData():void {
vbox.removeAllChildren();
var array:Array = getData();
for (var i:int = 0; i < array.length; i++) {
var rend:MyRenderer = new MyRenderer();
rend.data = array[i];
box.addChild(rend);
i++;
}
}
|
Do you see the dangerous statement? Not yet? Let me show you. To simulate a repeated action I add a timer which calls the load function each N seconds.
1
2
3
4
5
|
private function init():void {
var t:Timer = new Timer(2000);
t.addEventListener(TimerEvent.TIMER, tick);
t.start();
}
|
Now try running the profiler. Do you see an ever growing graph like this?
Congrats! We have found a memory leak! A memory leak happens when the same action is repeated and memory consumption grows instead of being constant. Did you find the dangerous statement? It is when you create the renderer. Why? Because you assume that removeAllChildren()
removes renderers from the memory. Wrong! As said above that method only removes renderers from the display tree. In fact, as you can see in the profiler, renderers are still there, consuming memory.
UPDATE: Technically speaking this is not a memory leak, because there is nothing that prevents the garbage collector to clean up memory from renderers. A memory leak happens, in fact, when there is something that is supposed to use the renderer (e.g. a listener) even when you remove it from the display tree. In this example renderers are ‘free” and could be garbage collected. But they are not. So the result is the same of a memory leak, an ever growing memory consumption.
There are many techniques to solve this situation. We will show two: caching renderers and dynamic caching.
发表评论
-
AIR html 内存泄露
2010-07-15 14:21 1727众所周知,Flex虽然在客户体验方面独领风骚,但是其 ... -
Flex 内部命名空间
2010-05-11 13:27 1327使用方式如下: //引用命名空间 im ... -
AIR开发下的ALert窗口无法弹出
2010-05-05 10:55 1558最近在从事AIR编程。AIR开发和之前做的RIA开发还是 ... -
Flex调用JS代码
2010-03-03 11:23 5282在Flex开发中有时候需要调用JS代码,例如关闭浏览 ... -
Flex设置浏览器标题
2010-03-03 11:17 3044在Flex下设置页面浏览器标题Title工有两种方式 ... -
Flex版在线PhotoShop(2个)
2010-03-02 13:47 2187刚刚看到了一个Flex版本的Online PhotoShop工 ... -
Degrafa渲染DataGrid
2009-12-22 09:58 2126在DataGrid中可以利用多种组件实现Column ... -
Flex3D 视屏网站
2009-12-21 08:28 1185http://www.hboimagine.com/#/the ... -
多种DataGrid ItemRender实现
2009-12-10 15:00 2116在Flex开发中,可能在展示数据方面,DataGr ... -
Flex RSL(Runtime Shared Library)
2009-12-10 08:03 1778RSL是 Runtime Shared Lib ... -
Degrafa(Beta3)源码
2009-12-08 17:01 1232Degrafa源码共享下载,见附件。 -
Flex 动态换肤
2009-12-08 16:57 1832可能很多人在写Flex程序的时候为了界面的美化,都会用 ... -
Flex Sound Effect 异常
2009-12-08 13:14 1183早上在写Flex代码的时候,想放首歌听听,不知道什么原 ... -
推荐一个不错的Flex网站
2009-12-07 15:51 1271今天看到了一个相当不错的关于Flex/Flash开发的英文站点 ... -
Flex+Java文件上传
2009-12-07 10:14 4444在研究Flex DataGrid导入exc ... -
Flex DataGrid导入Excel(一)
2009-12-02 18:46 5602这篇Blog只是写实现思路。 记得刚毕业 ... -
Flex版FusionCharts图形组件
2009-11-27 08:34 3863在Flex图形领域,FusionCharts为广 ... -
DataGrid导出Excel
2009-11-24 16:54 6416在Adobe的RIA开发环境下,flex并没有导出 ... -
Flex高级表格(Mecgrid)
2009-11-20 13:52 4419最近在考虑DataGrid单元格定位的问题时,收集到了 ... -
DataGrid单元格定位
2009-11-20 13:39 4875在Flex项目开发中,相信很多人会用到DataG ...
相关推荐
本篇文章将深入探讨Flex虚拟机的内存管理机制以及如何预防和处理内存泄漏问题。 内存管理在任何软件开发中都至关重要,尤其是在动态语言如ActionScript中。Flex虚拟机采用了一种自动垃圾回收(Garbage Collection, ...
通过本篇文章的学习,我们可以清楚地了解到对象缓存技术在提升Flex应用程序性能方面的重要作用。它不仅可以减少内存使用,还能提高应用程序的整体性能和稳定性。对于那些需要处理大量用户交互和频繁对象创建的应用来...
以上是Flex3.0面试题涉及的主要知识点,包括ActionScript版本差异、开发框架特点、MVC实施、内存管理、垃圾回收机制、前后端通信、性能优化以及Flash与Flex的协作方式。这些知识对于理解和实践Flex3.0开发至关重要。
1. 垃圾回收:理解ActionScript 3.0的垃圾回收机制,避免内存泄漏。 2. 性能监控:使用Flex Profiler分析应用性能,找出瓶颈并进行优化。 3. 缓存策略:有效利用Flash Player的本地存储,缓存数据以提高性能。 七、...
启动参数用于控制JVM的行为,常见的参数包括-Xms(最小堆内存)、-Xmx(最大堆内存)、-XX:+UseConcMarkSweepGC(垃圾回收算法)等。 ### 26. 一个优秀的JAR包下载站点:Apache Maven Repository Apache Maven ...
3. **内存管理**:有效释放不再使用的对象,避免内存泄漏,合理使用垃圾回收机制。 4. **使用开发工具**:利用Adobe Animate的性能分析器或其他第三方工具检测性能问题。 5. **Flex 4框架**:学习Flex 4的新特性,...
6. **利用垃圾回收机制**:及时释放不再使用的对象,防止内存泄漏。 转正工作总结则是软件工程师在试用期结束时对个人工作成绩、问题及改进方向的反思和记录。通常会包含以下内容: 1. **项目参与**:列出参与的...
- **性能优化**:作者还提到了BitmapData对象的内存管理问题,比如如何避免过多的垃圾回收,以确保程序运行效率。 - **Sprite 类**:Sprite 类是AS3中最常用的显示对象容器之一,它可以包含多个子项,并提供了一...
10. **性能优化**:学习如何避免内存泄漏,正确使用垃圾回收,以及优化代码以获得更好的运行效率。 11. **Flex框架**:如果PDF还包括Flex相关内容,那么Flex Builder、MXML和CSS布局也会是重要的学习部分。 通过...