我從我的代碼(用java編寫)中調用函數,我想知道該函數正在使用多少內存,並且請記住,我不能添加任何代碼到函數(我打電話)。如何查找在java中使用的功能內存
爲EG-
//my code starts
.
.
.
.
myfunc();
//print memory used by myfunc() here
.
.
// my code ends
如何做到這一點?
我從我的代碼(用java編寫)中調用函數,我想知道該函數正在使用多少內存,並且請記住,我不能添加任何代碼到函數(我打電話)。如何查找在java中使用的功能內存
爲EG-
//my code starts
.
.
.
.
myfunc();
//print memory used by myfunc() here
.
.
// my code ends
如何做到這一點?
你想要做的事情基本上沒有意義。有沒有這樣的東西功能使用的內存。你比較「之前」和「之後」函數調用的總內存使用情況的想法沒有任何意義:該函數可能會改變全局狀態(這可能會減少或增加總內存使用量,並且在某些情況下(例如緩存填充)不希望將增加計爲「由函數使用的內存),或者垃圾收集器可能在myfunc
的內部運行,並減少已用內存總量。
好問題通常包含大答案的一部分。你應該做的是正確地提出這樣的問題。
但其錯誤的,因爲理想的應該永遠是subraction後爲零。
其實它的正確的,因爲通常每個線程都有一個TLAB(線程本地分配緩衝區),這意味着它分配的塊與-XX:-UseTLAB
(所以每個線程可以同時分配)
關閉此功能,你會看到曾經字節,分配。
您應該多次運行此操作,因爲使用此功能時可能會運行其他操作。
我成功使用此代碼(它不保證其正常工作,但嘗試一下,有一個很好的機會,它會給你你所需要的):
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);
@ vikiii-我曾嘗試使用此 - 「Runtime.getRuntime()。totalMemory() - Runtime.getRuntime()。freeMemory();」。我在調用myfunc()之前和之後都放了它。然後將其從另一箇中劃分出來以獲得使用的全部內存。但是它的錯誤,因爲理想的情況下它應該總是在零之後爲零。 – 2012-04-17 06:40:13
*爲什麼*應該是零?如果該函數在函數退出後仍然引用的堆上分配內存,該怎麼辦? – EJP 2012-04-17 10:22:14