简体   繁体   中英

c# System.OutOfMemoryException in mscorlib.dll

I am using VS 2017. I am getting "OutOfMemory in mscorlib.dll" exception in my vsix project. I am using Roslyn in this project, below is my method to find Field Declaration and references.

public static async Task FindFieldDeclarationAndReferencesAsync(string solutionPath, List<Violation> violations) 
{           
    var msWorkspace = MSBuildWorkspace.Create();
    var solution = await msWorkspace.OpenSolutionAsync(solutionPath);***//The solution I am passing to this workspace is 1 GB***
    var documents = solution.Projects.SelectMany(x => x.Documents).ToList();

    foreach (var violation in violations)//violations.Count is approximately 10
    {
        var classFile = documents.Where(x => x.FilePath == violation.FilePath).FirstOrDefault();
        var model = await classFile.GetSemanticModelAsync();
        var root = await classFile.GetSyntaxRootAsync();
        var classDeclarationNode = root.DescendantNodes().OfType<ClassDeclarationSyntax>().Where(x => x.Identifier.Text == violation.ClassName).FirstOrDefault();

        var fieldDeclarationNodeList = classDeclarationNode.DescendantNodes().OfType<FieldDeclarationSyntax>().Where(m => m.Modifiers.ToString().Contains("public const")).SelectMany(x => x.Declaration.Variables.Where(y => y.Identifier.Text == violation.FieldName)).FirstOrDefault();

        ISymbol fieldSymbol = model.GetDeclaredSymbol(fieldDeclarationNodeList);
        var fieldReferences = await SymbolFinder.FindReferencesAsync(fieldSymbol, solution);
        violation.FieldDeclaration = fieldDeclarationNodeList;
        violation.Replacement = Helpers.GetIdentifierReplacement(violation.FieldName);
        violation.References = fieldReferences.SelectMany(item => item.Locations).ToList();
    }               
}

Am I getting this exception as the solution size is 1 GB which is passed to Roslyn while creating workspace?

Exception Details:

System.OutOfMemoryException
  HResult=0x8007000E
  Message=Exception of type 'System.OutOfMemoryException' was thrown.
  Source=mscorlib
  StackTrace:
   at System.Threading.ExecutionContext.Capture(StackCrawlMark& stackMark, CaptureOptions options) in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 1281
   at System.Threading.ExecutionContext.FastCapture() in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 1190
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.GetCompletionAction(Task taskForTracing, MoveNextRunner& runnerToInitialize) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\AsyncMethodBuilder.cs:line 916
   at System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1.AwaitUnsafeOnCompleted[TAwaiter,TStateMachine](TAwaiter& awaiter, TStateMachine& stateMachine) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\AsyncMethodBuilder.cs:line 543
   at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_1(Object state) in f:\dd\ndp\clr\src\BCL\system\runtime\compilerservices\AsyncMethodBuilder.cs:line 1034
   at System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state) in f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs:line 1273
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 954
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) in f:\dd\ndp\clr\src\BCL\system\threading\executioncontext.cs:line 901
   at System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() in f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs:line 1250
   at System.Threading.ThreadPoolWorkQueue.Dispatch() in f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs:line 819
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() in f:\dd\ndp\clr\src\BCL\system\threading\threadpool.cs:line 1161

I checked the Handles in TaskManager for my process and below are the values.

任务管理器,手柄

I want to get out of this exception. Please suggest a solution.

I found the object which was taking more memory using Visual studio "Diagnostic Tools" window . Taken memory screenshot at the start and end of the code and compared both and fixed the issue.

violation.FieldDeclaration and violation.References took so much memory when the violations object count is huge. so setting those properties to null in the finally block at the end of each iteration has fixed the issue for me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM