簡體   English   中英

通過JNI監視使用Java調用的C DLL的內存使用情況?

[英]Monitoring memory usage for a C DLL called with Java via JNI?

如何監視通過JNI從Java調用的本機C DLL使用的內存? 使用標准的Java監視工具和選項我可以看到Java內存空間,但我無法查看C DLL使用的任何內存。 Java正在使用~70MB,但任務管理器中的任務顯示200Mb +,如果可能的話,我想看看130MB的額外內容。

您可以使用性能監視器中的計數器監視本機堆。 (perfmon32)然而,它不會在每個DLL的基礎上為你分解,甚至jvm.dll將包含在這里。

大多數分析工具可以附加到進程並捕獲和跟蹤內存分配和釋放。 這允許他們推測泄漏的位置。 我最近在嘗試跟蹤從Java調用的本機代碼中的內存泄漏時發現的一個非常好的內存是Memory Validator

您是否嘗試過使用Process Viewer深入挖掘。

如果您有DLL的源代碼,您可以使用調試庫和可能的內存分配跟蹤器進行重建 - 並使用Visual C ++調試器進行調試(您需要告訴它使用java應用程序)。

如果您還沒有來源 - 則選項有限。

我相信即使在C DLL中執行此操作也不是很容易。

據我所知,標准Java監控工具通過查詢虛擬機來收集信息,因此即使該內存處於同一進程中,除非虛擬機知道如何檢查動態鏈接庫,否則它將無法看到任何內容。 我相信您需要使用外部工具或對DLL進行一些大量修改才能跟蹤其內存使用情況。

好吧,既然DLL實際上不是Java堆的一部分,我認為最准確的解讀是編寫一個小的分析程序(小型Java / JNI程序或C ++ / C#等)來導入和使用DLL與您的應用程序的方式類似,並且不做任何操作 - 只需像您一樣使用DLL - 此配置文件應用程序的結果內存配置文件應該是DLL的內存配置文件的良好近似值。

您還應該測試是否存在DLL的靜態動態內存形狀 - 在加載DLL之前和之后直接進行內存測量,以查看是否存在~130MB的一次性命中,或者內存是否緩慢上升時間。

在Solaris / Linux上,我聽說Sun Studio Collector / Analyzer是一個很好的工具,但是你被困在DLL-land(或DLL地獄,就像它)

暫無
暫無

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

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