Quantcast
Channel: ClearScript
Viewing all articles
Browse latest Browse all 2297

Commented Issue: Continuous Allocation of V8ScriptEngine Can Crash Application [106]

0
0
When allocating a V8ScriptEngine objects within a loop causes memory to remain allocated even if you force all references to the object to null and eventually crashes the application with a System.AccessViolationException. The details of the crash is below.

_Currently coding against version 5.4.5.0 of ClearScript._

__This Code Snippet Fails (Normally at iteration 134 the failure occurs)__
for (int i = 1; i <= 1000; i++)
{
var v8Engine = new Microsoft.ClearScript.V8ScriptEngine();
v8Engine = null;
}

__This Code Snippet Works:__
for (int i = 1; i <= 1000; i++)
{
var v8Engine = new Microsoft.ClearScript.V8ScriptEngine();
v8Engine = null;
//Invoking Garbage Collection Every 50 V8ScriptEngine object allocated
//Fixes the issue
if(i%50 == 0)
GC.Collect();
}

__Here are the details of the crash:__
Problem signature:
Problem Event Name: CLR20r3
Problem Signature 01: ClearScriptDemo.exe
Problem Signature 02: 1.0.0.0
Problem Signature 03: 572a5c94
Problem Signature 04: ClearScriptV8-32
Problem Signature 05: 5.4.5.0
Problem Signature 06: 56e184c1
Problem Signature 07: e6
Problem Signature 08: 78
Problem Signature 09: System.AccessViolationException
OS Version: 6.1.7601.2.1.0.256.4
Locale ID: 1033
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

Comments: Thank you for the feedback. I made the changes based on the suggestion of using the V8Runtime.CreateScriptEngine() function. However now I am seeing something that I did not expect. According the ClearScript Library documentation: "Call Dispose() when you are finished using the script engine. Dispose() leaves the script engine in an unusable state. After calling Dispose(), you must release all references to the script engine so the garbage collector can reclaim the memory that the script engine was occupying. " However it appears that only when I dispose of the V8Runtime object does the Garbage Collection actually reclaim the memory for the unreferrenced V8ScriptEngine objects created using the V8Runtime.CreateScriptEngine() function. Please see the two code snippets below. __//This code does not cause Garbage Collection to clean up unreferenced V8ScriptEngine objects__ V8Runtime _v8Runtime = new V8Runtime(); V8ScriptEngine v8Engine = null; for (int i = 1; i <= 1000; i++) { v8Engine = _v8Runtime.CreateScriptEngine(); v8Engine.Dispose(); //Dispose call does not free memory. } __//This code cause Garbage Collection to clean up unreferenced V8ScriptEngine objects__ V8Runtime _v8Runtime = new V8Runtime(); V8ScriptEngine v8Engine = null; for (int i = 1; i <= 1000; i++) { var v8Engine = _v8Runtime.CreateScriptEngine(); v8Engine.Dispose(); //Calling Dispose on V8Runtime frees memory for V8ScriptEngines if (i%50 == 0) { _v8Runtime.Dispose(); _v8Runtime = new V8Runtime(V8RuntimeFlags.EnableDebugging); } }

Viewing all articles
Browse latest Browse all 2297