使用我发现的以下类here,我可以获得有关VM内存的一些统计信息。
但是,还有一种方法可以获得我的程序所需的最大内存或程序的特定方法吗?
/**
* Class: TestMemory
* @author: Viral Patel
* @description: Prints JVM memory utilization statistics
*/
public class TestMemory {
public static void main(String [] args) {
int mb = 1024*1024;
//Getting the runtime reference from system
Runtime runtime = Runtime.getRuntime();
System.out.println("##### Heap utilization statistics [MB] #####");
//Print used memory
System.out.println("Used Memory:"
+ (runtime.totalMemory() - runtime.freeMemory()) / mb);
//Print free memory
System.out.println("Free Memory:"
+ runtime.freeMemory() / mb);
//Print total available memory
System.out.println("Total Memory:" + runtime.totalMemory() / mb);
//Print Maximum available memory
System.out.println("Max Memory:" + runtime.maxMemory() / mb);
}
}
答案 0 :(得分:0)
因此,方法本身不占用JVM上的内存,它是您在方法中创建的对象等。创建方法本身只会在编译的类上创建更大的占用空间。
您可以尝试使用VisualVM或JProfiler等内容进行分析。尝试在Debug中设置断点,并在逐步完成程序时观察这些分析器中的内存,并记下所谓的“问题区域”。
这些分析器将为您提供大量的性能统计信息,以便您全面了解所需的内存等。
答案 1 :(得分:0)
许多年前,我使用Classmexer代理来测量特定对象的深度内存使用情况。 http://www.javamex.com/tutorials/memory/instrumentation.shtml
恕我直言,对于大多数情况来说,使用Java Profiler获得全局图片更有用。我想,除了有趣之外,如果你真的需要在堆中存储大量实例,那么Classmexer的一个用例就是进行大小调整。