注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

为着理想勇敢前进

 
 
 

日志

 
 

ActionScript的资源不必手动释放  

2008-08-16 21:45:01|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
我们知道.NET的很多类都实现了IDisposable接口和dispose方法,而Java的很多类也实现了Closeable接口和close方法。不论是dispose方法还是close方法都要求用户手动调用来释放资源。
可是.NET和Java不是都有垃圾收集吗?为何还需要手动释放资源呢?

这是因为.NET和Java的垃圾收集器并不会立即释放资源,而只在需要的时候才释放资源。某些类是对内核对象的一层包装,它们往往只占用了极少的内存,但却持有系统中某个内核对象,这个内核对象却可能有很大的开销。比如文件句柄。垃圾收集器会在用户内存不足的情况下进行垃圾收集,但却不会顾及操作系统资源是否紧张。比如打开很多文件,可能对于.NET或者Java的虚拟机来说,只分配了很少的内存,根本无所谓,但是对操作系统来说,却可能给这些文件提供了许多的系统缓存。

因此,.NET和Java就提供了dispose或close,这两个方法只会释放系统资源,而不释放内存。因为释放内存是垃圾收集器的职责,不需要用户操心。

最好的做法是在编写.NET和Java代码的时候手动调用dispose或close.

不过,对于ActionScript来说就不是这样的。ActionScript的垃圾收集同时使用了“引用计数”和“标记整理”两个机制。如果一个对象没有被引用,就会立刻被收集。而如果某个对象虽然有引用但却只有循环引用,那么AVM在内存不足的时候会遍历引用关系,把这些只有循环引用的对象也收集掉。

因此在ActionScript中,如果能保证某个持有昂贵资源的对象不被循环引用,那么完全可以不调用其close方法,不必手动释放。

甚至用ActionScirpt编写AIR应用时使用数据库都不必手动释放。
  评论这张
 
阅读(225)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018