Hi,<div><br></div><div>We are investigating some memory leaks in Mono that happen on Windows. In our (Unity) case, we live in a web browser and when closing our plugin the process does not terminate. Turns out there are some GC related memory leaks that persist after shutting down Mono. We are using quite an old Mono version, but from a quick glance at 2.4 and svn, looks like they could be there as well.</div>
<div><br></div><div>We found that there are some VirtualAlloc() calls that are never freed. They mostly manifest themselves when allocating large managed arrays (it looks like for large memory blocks a different allocation code path is used).</div>
<div><br></div><div>What we changed (everything on Windows):</div><div><br></div><div>1) add a call to GC_win32_free_heap() at the end of mono_jit_cleanup</div><div><br></div><div>2) change GC_win32_free_heap() to do VirtualFree as well (added whole &quot;else&quot; block):</div>
<div><br></div><div><div><div>void GC_win32_free_heap ()</div><div>{</div><div>    if (GC_no_win32_dlls) {</div><div>        while (GC_n_heap_bases &gt; 0) {</div><div>            GlobalFree (GC_heap_bases[--GC_n_heap_bases]);</div>
<div>            GC_heap_bases[GC_n_heap_bases] = 0;</div><div>        }</div><div>    } else {</div><div>        while (GC_n_heap_bases &gt; 0) {</div><div>            VirtualFree(GC_heap_bases[--GC_n_heap_bases], 0, MEM_RELEASE);</div>
<div>            GC_heap_bases[GC_n_heap_bases] = 0;</div><div>        }</div><div>    }</div><div>}</div><div><br></div><div><br></div><div>The above seems to fix major leaks. We are not totally sure if it&#39;s the right thing to do, but it does look like some VirtualFree() calls were missing.</div>
</div></div><div><br clear="all"><br>-- <br>Aras Pranckevičius<br>work: <a href="http://unity3d.com">http://unity3d.com</a><br>home: <a href="http://aras-p.info">http://aras-p.info</a><br>
</div><div><br></div>