c# System.OutOfMemoryException in mscorlib.dll

0

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.

TaskManager-handles

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

c#
roslyn
vsix
asked on Stack Overflow Aug 6, 2018 by Gifty • edited Aug 6, 2018 by dymanoid

1 Answer

0

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.

answered on Stack Overflow Aug 27, 2018 by Gifty

User contributions licensed under CC BY-SA 3.0