我们可以通过XslCompiledTransform类使用XSLT样式表转换XML数据
![](/icons/89670dou.gif)
但我在项目中使用此类
![](/icons/89670de.gif)
时候发现有内存泄漏(Memory Leak)现象
![](/icons/89670dou.gif)
长时间不能进行回收
![](/icons/89670de.gif)
内存最终导致内存溢出
![](/icons/89670de.gif)
异常(Exception: Out Of Memory, OOM)发生
原来
![](/icons/89670dou.gif)
XslCompiledTransform类使用CodeDom将XSL以及其中
![](/icons/89670de.gif)
脚本编译到.NET
![](/icons/89670chengxu.gif)
集中
![](/icons/89670dou.gif)
并将其加载到当前
![](/icons/89670de.gif)
应用
![](/icons/89670chengxu.gif)
域(AppDo
![](/icons/89670main.gif)
)
![](/icons/89670dou.gif)
所以也就需要占用内存
![](/icons/89670dou2.gif)
如果每次进行XSL转换
![](/icons/89670de.gif)
时候都重新加载XSL以及脚本就会导致内存不断增加
![](/icons/89670dou.gif)
直到发生内存溢出
![](/icons/89670de.gif)
![](/icons/89670cuowu.gif)
解决
![](/icons/89670de.gif)
办法是我们用全局
![](/icons/89670de.gif)
Hashtable变量将其进行缓存Cache
![](/icons/89670dou.gif)
即可解决问题
P.S:多次使用XSL转换
![](/icons/89670de.gif)
时候记得要通过XslCompiledTransform.TemporaryFiles.Delete
![](/icons/89670kh.gif)
思路方法进行清除
参考资料:
Resource Leak from XslCompiledTransform
发现博客园也有
![](/icons/89670yi.gif)
篇相关
![](/icons/89670de.gif)
文章
![](/icons/89670smhl.gif)
您注意到XslCompiledTransform性能没有?
![](/icons/89670smhr.gif)
![](/icons/89670dou.gif)
里面推荐使用单件模式
![](/icons/89670dou.gif)
这样会频繁进行加载和转换
![](/icons/89670dou.gif)
![](/icons/89670yinwei.gif)
加载思路方法不是线程安全
![](/icons/89670de.gif)
很可能引起
![](/icons/89670cuowu.gif)
![](/icons/89670dou.gif)
再者会生成很多临时问题
![](/icons/89670dou2.gif)
而根据XSL文件来决定缓存CacheXslCompiledTransform类例子
![](/icons/89670de.gif)
个数将是最合适不过
![](/icons/89670de.gif)
思路方法
其实这不是什么内存泄漏也不是什么性能问题
![](/icons/89670dou.gif)
而是我们对于其处理机制
![](/icons/89670de.gif)
不了解
![](/icons/89670dou2.gif)
以后我们就知道内存增长先检查应用
![](/icons/89670chengxu.gif)
变量和会话变量
![](/icons/89670dou.gif)
再者要看看有没有滥用XslCompiledTransform类了
延伸阅读
最新评论