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.
User contributions licensed under CC BY-SA 3.0