2012-04-17 112 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);