继续我前几天的疑问。好不容易完成了自定义存储,和修改了原来的Cache类的存储,然后在测试NullBackingStore,IsolatedStorageBackingStore ,DataBackingStore ,CustomBackingStore的性能,加载一个20M的数据到Cache中,然后发现一个有意思义的现象。当我使用数据库缓存的时候,发现我内存直线上升。而且当数据缓存到数据库的时候,内存里的数据长时间没有进行垃圾回收(涉及到垃圾回收)。然后又回去测试NullBackingStore,结果一切正常。内存的使用率也就是上升了30M左右,反反复复测试了无数次。终于发现可能DataBackingStore 存在性能问题。在断点调试的时候,在Cacheing DataBase中。在LoadDataFromStore方法,加载数据使用DataSet,然后还有一个严重的地方在
string key = newItem.Key;
byte[] valueBytes = SerializationUtility.ToBytes(newItem.Value);//TODO:这里又吃掉很大一部分内存,而且长期间释放不了。
if (this.encryptionProvider != null)
{
valueBytes = this.encryptionProvider.Encrypt(valueBytes);
}
原选我打算手工进行对valueBytes对象进行垃圾回收。就是获取valueBytes 对象的代龄,然后强制回收掉。但这样有一个结果就是:如果有其它对象跟valueBytes 对象在同一个代龄。当我强制回收肯定也会清空了其它对象。IsolatedStorageBackingStore 也存在相同的问题。没办法。最好的方法就是能有一个方法能够手工单单清除valueBytes ,不知道使用WeakReference.Target有没有效果?还没有测试过。
所以大家还是慎用DataBackingStore缓存。