Apps相关内存泄漏易发生点:
成因:
1、用接口引用InterfacedPersistent对象后,接口引用失去时只减少引用计数,并不会在引用计数为零时释放对象本身(InterfacedObject则会自动释放),APPS中有大量这种用接口引用InterfacedPersistent的应用,故泄漏基本都上出自这方面。解决方法有二:一是,不使用接口获取对象引用,直接使用抽象基类获取(影响整体框架不考虑);二是,对接口或者实现类添加自定义的IAsObject接口,实现asObject方法,返回对象本身,再进行释放。
1、用接口引用InterfacedPersistent对象后,接口引用失去时只减少引用计数,并不会在引用计数为零时释放对象本身(InterfacedObject则会自动释放),APPS中有大量这种用接口引用InterfacedPersistent的应用,故泄漏基本都上出自这方面。解决方法有二:一是,不使用接口获取对象引用,直接使用抽象基类获取(影响整体框架不考虑);二是,对接口或者实现类添加自定义的IAsObject接口,实现asObject方法,返回对象本身,再进行释放。
2、TList的GetEnumerator问题,其内部实现是Create一个TlistEnumerator的,获取后需手动释放,在ddom中存在没释放的问题,另外调用了ddom中的.iterator()方法也实际上是调用GetEnumerator,用后注意释放。
3、Element.getChildren会Create一个List,使用完后要手工释放。只获到子节点数的话,可用getContentSize()
具体细节:
1、Logger接口实现类由于继承于InterfacedPersistent,对象失去接口引用时,只会减少引用计数,引用计数为0时并不会自动释放Logger所引用对象,需设法获取对象本身(如添加asObject方法返回对象本身)。现用单例模式处理并不需要频繁释放。
1、Logger接口实现类由于继承于InterfacedPersistent,对象失去接口引用时,只会减少引用计数,引用计数为0时并不会自动释放Logger所引用对象,需设法获取对象本身(如添加asObject方法返回对象本身)。现用单例模式处理并不需要频繁释放。
2、Servlet释放问题,原因同上,已对Servlet添加asObject,在HTTPHandler添加了释放代码
3、DOMOutputter也是同样问题,由于ddomrtl为公用模块,为保证兼容性,DOMOututter添加asObject方法,获取对象本身后手动释放。
4、HTTPHandler问题同上。。。解决方法也是用asObject手动释放算了。。。