San*_*era 6 .net garbage-collection memory-leaks memory-management sitecore
我有一个Sitecore应用程序,我需要在另一个系统的循环中创建大量的Sitecore项目.以下是我的测试目的循环;
using (new Sitecore.SecurityModel.SecurityDisabler())
{
for (int i = 0; i < 20000; i++)
{
Item newItem = MyTemplateItem.CreateItemFrom(DateTime.Now.Ticks.ToString(), myParentItem);
newItem.Editing.BeginEdit();
newItem.Fields["Title"].Value = Guid.NewGuid().ToString();
newItem.Editing.EndEdit();
}
}
Run Code Online (Sandbox Code Playgroud)
当此循环正在运行并且在查看任务管理器时,进程内存使用量随着时间的推移而增加.
Sitecore Item类还没有实现IDisposable接口,所以我无法调用已创建项的Finalizer.
我怎样才能避免这种内存泄漏?
PS:我正在使用Windows应用程序来执行此操作以绕过IIS进程内存泄漏,其中Sitecore执行其缓存更新和索引构建,这应该在此过程结束时完成.
您可以在项目创建期间暂时禁用数据库缓存:
using (new Sitecore.Data.DatabaseCacheDisabler())
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法在创建过程中禁用索引:
Sitecore.Configuration.Settings.Indexing.Enabled = false;
Run Code Online (Sandbox Code Playgroud)
尝试添加这两件事,看看是否有帮助。
更新:也许这会起作用。在 EndEdit() 之后将其添加到循环中:
newItem = null;
if (i % 100 == 0)
{
GC.Collect();
GC.WaitForPendingFinalizers();
}
Run Code Online (Sandbox Code Playgroud)
每次添加 100 个项目时,它将强制垃圾收集器尝试回收未使用的内存。
如果这有效,那么您实际上不必自己调用 GC,它会在某个时刻自动发生,只是您不知道何时。