2012-04-17 108 views
2

我從我的代碼(用java編寫)中調用函數,我想知道該函數正在使用多少內存,並且請記住,我不能添加任何代碼到函數(我打電話)。如何查找在java中使用的功能內存

爲EG-

//my code starts 
    . 
    . 
    . 
    . 
    myfunc(); 
//print memory used by myfunc() here 
    . 
    . 
// my code ends 

如何做到這一點?

+0

@ vikiii-我曾嘗試使用此 - 「Runtime.getRuntime()。totalMemory() - Runtime.getRuntime()。freeMemory();」。我在調用myfunc()之前和之後都放了它。然後將其從另一箇中劃分出來以獲得使用的全部內存。但是它的錯誤,因爲理想的情況下它應該總是在零之後爲零。 – 2012-04-17 06:40:13

+0

*爲什麼*應該是零?如果該函數在函數退出後仍然引用的堆上分配內存,該怎麼辦? – EJP 2012-04-17 10:22:14

回答

7

你想要做的事情基本上沒有意義。有沒有這樣的東西功能使用的內存。你比較「之前」和「之後」函數調用的總內存使用情況的想法沒有任何意義:該函數可能會改變全局狀態(這可能會減少或增加總內存使用量,並且在某些情況下(例如緩存填充)不希望將增加計爲「由函數使用的內存),或者垃圾收集器可能在myfunc的內部運行,並減少已用內存總量。

好問題通常包含大答案的一部分。你應該做的是正確地提出這樣的問題。

+0

@ penartur-我打電話給一個遠程api,我需要測試它的性能,所以我需要獲取它的內存使用情況。那是不可能的? – 2012-04-17 07:00:25

+1

+1好問題通常包含大部分答案。 – Jayan 2012-04-17 08:14:59

+0

*性能*是什麼意思?順便說一下,遠程API *(通常意味着一些基於SOAP或基於東西的遠程** API,它在**遠程**服務器上運行,從而檢查其內存要求使得更少的意義,因爲內存是在一些**遠程**服務器上消耗的,而不是在您的PC上)。 – penartur 2012-04-17 08:23:05

0

但其錯誤的,因爲理想的應該永遠是subraction後爲零。

其實它的正確的,因爲通常每個線程都有一個TLAB(線程本地分配緩衝區),這意味着它分配的塊與-XX:-UseTLAB(所以每個線程可以同時分配)

關閉此功能,你會看到曾經字節,分配。

您應該多次運行此操作,因爲使用此功能時可能會運行其他操作。

1

我成功使用此代碼(它不保證其正常工作,但嘗試一下,有一個很好的機會,它會給你你所需要的):

final Runtime rt = Runtime.getRuntime(); 
for (int i = 0; i < 3; i++) rt.gc(); 
final long startSize = rt.totalMemory()-rt.freeMemory(); 
myFunc(); 
for (int i = 0; i < 3; i++) rt.gc(); 
System.out.println("Used memory increased by " + 
    rt.totalMemory()-rt.freeMemory()-startSize);