簡體   English   中英

如何調試高內存消耗

[英]How to debug high memory consumption

我編寫了一個使用OpenCV持久性模塊讀取.xml.gz文件的程序。 我使用一個類來管理這些數據。 在構造函數中,它使用cv::FileStorage讀取所有數據。 所有數據都在成員變量中,這些成員變量可以是std::vectorcv::Mat 在類的每個實例之間沒有靜態成員或任何共享的對象。

這是奇怪的事情。 如果僅使用類的一個實例,則該程序將消耗約50MB的內存。 但是,如果我使用兩個實例,它將消耗約600MB。 如果我使用三個,它將消耗大約650MB。 如果使用四個,則將消耗約700MB的內存。似乎只有一個實例與多個實例之間存在奇怪的界限。

我做了一些實驗,下面是一些結果:

  1. 僅在Linux(Ubuntu 14.04,OpenCV 3.0)上而不在Windows上會發生此問題。
  2. 我使用valgrind進行檢查,並且程序中沒有內存泄漏。

這是此類的代碼: https : //github.com/delphifirst/FaceX/blob/master/FaceX/face_x.cpp

在我的代碼中指出問題或為我提供一些調試此類問題的建議都將非常有幫助。

編輯:我遵循注釋中的建議,並使用top -p而不是gnome-system-monitor來檢查內存消耗。 結果是:VIRT:1003552,RES:693228,SHR:8440,%MEM:33.8(計算機總共有2GB內存)

Edit2:我使用tcmalloc替換g ++的內存分配器,然后問題神秘地消失了。

您可以鏈接到tcmalloc(一個內存分配庫,它將替換程序中的常規內存分配例程)並使用其堆分析器。 堆分析器將告訴您內存消耗的來源(即程序中的哪些函數正在分配所有內存)。 這將為您進行進一步調試提供一個良好的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM