我从我的代码中调用一个函数(用java编写),我想知道函数正在使用多少内存,并且请记住我不能向函数添加任何代码(我正在调用它)。
例如 -
//my code starts
.
.
.
.
myfunc();
//print memory used by myfunc() here
.
.
// my code ends
怎么做?
答案 0 :(得分:7)
你要做的事情基本没有意义。没有函数使用的内存。你在比较“之前”和“之后”函数调用的总内存使用量的想法没有任何意义:函数可能会改变全局状态(这可能会减少或增加总内存使用量,在某些情况下(例如缓存填充)你可能不希望将增加量视为“函数使用的内存”,或者当您在myfunc
内时垃圾收集器可能会运行并减少总使用内存。
这个好问题通常包含很大一部分答案。你应该做的是正确地提出这个问题。
答案 1 :(得分: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);
答案 2 :(得分:0)
但它错了,因为理想情况下,在减法后它应该总是为零。
实际上它是正确的,因为通常每个线程都有一个TLAB(线程本地分配缓冲区),这意味着它在块中分配(因此每个线程可以同时分配)
使用-XX:-UseTLAB
将其关闭,您将看到分配的字节。
您应该多次运行,因为使用此功能时可能正在运行其他内容。