A.1.3 内存管理
物理内存是十分有限的资源,但是,它必须在一个计算机系统上的所有进程之间共享。ActionScript、Java以及C++(www.cppentry.com)各自都由它们自己的方法来管理这些语言编写的程序使用的内存。以下是对一些高级差异的对比。
1. 自动与显式
由于AVM与JVM都是现代的运行时引擎,因此它们可以实现自动的垃圾回收系统。例如,在ActionScript中,AVM实现了MMgc,后者可以运行延缓的引用统计与递增的标记以及清除算法来决定哪些资源可以被系统释放。Java 的JVM中也内置有一个自动的垃圾回收器。
垃圾回收器令人关注的地方是接管了以前由开发人员负责的对象资源释放任务。与其担心那些释放的对象,不如开发人员确保当运行时计算机没有足够的内存分配给新的对象时,垃圾回收器将会定期地运行。
相反,C++(www.cppentry.com)没有垃圾回收系统。因此这就要求开发人员全权负责管理内存。在C++(www.cppentry.com)中,需要显式的析构函数,而且其实现代码必须由开发人员来完成。
2. delete关键字
由于C++(www.cppentry.com)需要显式内存管理,因此该语言实现了一个delete关键字,以便在开发人员在需要释放对象的时候使用。这意味着当某些对象不再需要时,开发人员需要勤快地删除这些对象;否则,他们的应用程序中将会包含内存泄露。
虽然ActionScript 3有一个delete关键字,但它却不释放对象。在ActionScript 3中,delete被用来动态地删除动态对象中的额外属性。而Java则没有delete关键字。
您可以这样认为,ActionScript 3与Java可能不会出现C++(www.cppentry.com)中那样的内存泄露,因为它们的内存管理是自动处理的。但是这个设想是错误的,因为AVM与JVM使用引用和对象可达性来决定何时需要释放对象的。换句话说,要避免ActionScript和Java中的内存漏洞要求开发人员来管理对象引用。