如何查找在java中使用的功能内存
问题描述:
我从我的代码(用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