<div dir="ltr">Benjamin had tried to come up with a repro at some point, too, iirc<br><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 9, 2017 at 4:48 PM Jusufadis Bakamovic via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Hi,<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">I am a little bit puzzled about the memory management in libclang. What I observed is, when run on mid-sized code base, a very high (understandable) memory consumption whereas it seems it is not possible to reclaim all the consumed memory back once we are finished with whatever we have been doing with libclang. For example, this is a code excerpt which should explain my words:</div><div class="gmail_msg"><br class="gmail_msg"></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class="gmail_msg"><div class="gmail_msg">// 1. Create an index</div><div class="gmail_msg">vector<CXTranslationUnit> tunits;</div><div class="gmail_msg">CXIndex idx = clang_createIndex(1, 1);</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">// 2. Parse each file found in directory and store corresponding TU into the vector</div><div class="gmail_msg">for (auto file& : directory) {</div><div class="gmail_msg">    CXTranslationUnit tu;</div><div class="gmail_msg">    if (!clang_parseTranslationUnit2(idx, file.path().c_str(), cmd_args, cmd_args_len, 0, 0, CXTranslationUnit_DetailedPreprocessingRecord, &tu)</div><div class="gmail_msg">        tunits.push_back(tu);</div><div class="gmail_msg">}</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">// 3. Cleanup</div><div class="gmail_msg">for (auto tu& : tunits) {</div><div class="gmail_msg">    clang_disposeTranslationUnit(tu);</div><div class="gmail_msg">}</div><div class="gmail_msg">clang_disposeIndex(idx);</div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">If I run this code on `cppcheck` code base (<a href="https://github.com/danmar/cppcheck" class="gmail_msg" target="_blank">https://github.com/danmar/cppcheck</a>) which is somewhat a mid-sized project (it counts cca 300 C/C++ files), I get the following figures in terms of memory consumption for that particular process (based on `htop` output):</div><div class="gmail_msg"><br class="gmail_msg"></div><blockquote style="margin:0 0 0 40px;border:none;padding:0px" class="gmail_msg"><div class="gmail_msg">* app memory consumption after 2nd step: virt(5763M) / res(5533M) / shr(380M)</div><div class="gmail_msg">* app memory consumption after 3rd step:  virt(4423M) / res(4288M) / shr(65188)</div></blockquote><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">So, as it can be seen from the figures, even after the cleanup stage, both virtual and resident memory figures are still very high. Seems like the only part which has been reclaimed is the memory that has been associated with the TU's. All the other, I can guess, parsing artifacts are still being hold somewhere in the memory to which we don't have access to neither we can flush them using the libclang API. I even ran the code with valgrind and there were no memory leaks detected (only `still reachable` blocks).</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Either I am missing something here or this might impose a memory issues for long-running non-single-shot tools (i.e. think indexer).</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Can anyone comment on this issue?</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Thanks,</div><div class="gmail_msg">Adi</div><div class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><br class="gmail_msg"></div></div></div>
_______________________________________________<br class="gmail_msg">
cfe-dev mailing list<br class="gmail_msg">
<a href="mailto:cfe-dev@lists.llvm.org" class="gmail_msg" target="_blank">cfe-dev@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br class="gmail_msg">
</blockquote></div></div>