Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何衡量java方法的内存使用情况_Java_Performance_Jvm - Fatal编程技术网

如何衡量java方法的内存使用情况

如何衡量java方法的内存使用情况,java,performance,jvm,Java,Performance,Jvm,听起来很奇怪,但仍然是。 假设我有一个java方法 boolean myMethod(Object param1, Object param2) { // here can be some simple calculations. can be some services invokation // or calls to DB. doesn't matter return someValue; } 如何测量JVM执行此方法所使用的内存量?有多少内存实际使用此方法执行它 有没

听起来很奇怪,但仍然是。 假设我有一个java方法

boolean myMethod(Object param1, Object param2) { 
   // here can be some simple calculations. can be some services invokation
   // or calls to DB. doesn't matter
  return someValue;
}
如何测量JVM执行此方法所使用的内存量?有多少内存实际使用此方法执行它

有没有工具,或者我可以在我的方法中添加一些额外的代码,以便能够查看已使用的内存


我使用
JConsole
来监视JVM,我也知道我们可以使用
java.lang.Runtime
来查看freeMemory,但实际上我无法计算我的方法使用这些工具时使用了多少内存。

我过去使用过以下工具,我发现它很有用:


测量方法每次调用的真实大小并不像听起来那么简单,JVM也不支持它。复杂性来自于a)因为JVM被设计来隐藏这种低级细节,b)JVM在任何时间点都可能有同一方法的多个变体,这听起来很疯狂,但也是事实。有些时候,该方法会被内联,或者进行更大规模的优化,甚至以特殊的方式重新编译,以支持该方法在运行时的热交换(!),这会从根本上改变其运行时大小

测量方法调用使用的堆数量

由于方法调用不使用堆,所以很容易说0字节。但是,您可能想知道通过方法调用分配的任何新对象的大小。这是可以回答的,但是对象是跨方法调用和线程共享的。因此,人们必须非常清楚他们想要测量什么,并注意不要重复计算。在Java中,有一些库会给出对象的大小,它们通常通过反射和启发式或包装sun.misc.Unsafe来检查指向对象及其数据的指针。比如说

测量方法的分配率

YourKit有一个优秀的工具,用于跟踪每个对象在其源点的分配,并报告它们的总大小和速率。这对于找出是谁导致GC流失非常有用

测量每个方法调用使用的堆栈数量

JVM不发布此信息,如前所述,它将根据当前活动的优化和正在使用的运行时编译器而有所不同


另一种方法是使用启发式方法。类似于计算方法中使用了多少变量,然后将计数乘以4,以字节为单位给出答案(假设每个变量的大小为4字节,即int)。显然,这种启发式方法有缺陷,可以改进,但它足够简单,可以给出一个快速且相当有代表性的答案。

您可以使用像jProfiler这样的评测工具。后来的JDK包括JVisualVM。它相当不错,是JConsole的继承者。我使用JVisualVM进行总体分析。JProfiler非常好,不是免费的。我也用过杰蒙进行起来很痛苦,但非常有用。您可以使用终端进行此特定用途。知道na。每个方法调用使用的内存是多少。您是在询问堆栈大小,还是堆栈使用率。。还是两者都有?@ChrisK用于堆使用