簡體   English   中英

如何剖析Java中的對象創建?

[英]How to profile object creation in Java?

我正在使用的系統正在創建大量對象並一直對其進行垃圾收集,這導致了堆消耗的鋸齒狀曲線。 我想知道正在生成哪些對象來優化代碼,但是在垃圾回收開始時,我想不出一種方法來轉儲堆。 當我嘗試通過JConsole手動手動啟動dumpHeap時,我總是在GC完成運行后得到結果,而沒有得到任何有用的數據。

歡迎提供有關如何追蹤過多臨時對象創建的任何注釋。

您正在尋找的是程序中最密集的分配站點。 您可以使用以下工具: Java分配工具 您的評論的答案:

當我嘗試通過JConsole手動手動啟動dumpHeap時,我總是在GC完成運行后得到結果,而沒有得到任何有用的數據。

的原因是堆轉儲會觸發VM中的GC,因為堆轉儲是(大部分情況下)堆中活動內容的報告-VM希望獲得堆轉儲時活動內容的最准確信息觸發,因此GC事件將始終在啟動轉儲請求后立即發生。

調優Java堆是一門藝術-網上有很多關於如何做到這一點的資料。

看一下BTrace可以做什么( http://kenai.com/projects/btrace/pages/Home ),或者嘗試在JDK 6u18中使用jvisualvm進行實時內存采樣。

Apache JMeter

從項目頁面引用:

Apache JMeter可用於測試靜態和動態資源(文件,Servlet,Perl腳本,Java對象,數據庫和查詢,FTP服務器等)的性能。 它可用於模擬服務器,網絡或對象上的重負載,以測試其強度或分析不同負載類型下的整體性能。

我記得M. Fowler提到過幾乎不可能猜測導致性能問題的原因,除非您使用探查器測試整個系統。

如果以上規定的解決方案均無法解決您的目的,則可以使用JVMPI接口 (和Dr.MEM等工具)並創建自己的自定義解決方案。 但是,根據您的問題,這可能是一個過大的殺傷力。

暫無
暫無

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

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