我制作了一个程序,它使用A *搜索算法来解决8个游戏难题。 我很想知道我的程序从开始到结束使用了多少内存。
到目前为止我已经完成了
在程序的开头
static double totalMem = Runtime.getRuntime().totalMemory()/(1024*1024);
static double memoryMax = Runtime.getRuntime().maxMemory()/(1024*1024);
并在程序结束时
timeTaken-=System.currentTimeMillis();
System.out.println("\n\n-------Total Time Taken = "+Math.abs(timeTaken)+
" millisec ------\n ");
System.out.println("-------Maximum Memory = "+memoryMax+" MB------\n ");
System.out.println("-------Total Memory = "+totalMem
+" MB------\n ");
currMem = Runtime.getRuntime().freeMemory()/(1024*1024);
System.out.println("-------Free Memory = "+currMem+" MB------\n ");
double memUsed = (Runtime.getRuntime().totalMemory())/(1024*1024)-currMem;
System.out.println("-------Total Used = "+memUsed
+" MB------\n ");
这似乎不对。当我用不同的数据集测试时。任何sugessition
答案 0 :(得分:6)
最好为此目的使用分析器或类似软件。您可以从jvisualvm开始,它包含在JDK或JProfiler中。
答案 1 :(得分:0)
问题看起来与线程局部分配缓冲区有关
可能会在TLAB上创建对象
阅读本文:https://blogs.oracle.com/jonthecollector/entry/the_real_thing
因此,每次运行程序时,它都会显示相似的值
通过关闭此功能运行程序,在VM参数中传递以下内容: -
-XX:-UseTLAB
答案 2 :(得分:0)
您还可以使用“Java Mission Control”(较新版本的JVisualVM),它可以让您拍摄内存快照。在程序启动时添加此参数:
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010
-Dcom.sun.management.jmxremote.local.only=true
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
它也位于JDK 7的“bin”文件夹中,名为:“jmc.exe”
答案 3 :(得分:0)
运行时正常运行。您可以在执行逻辑之前获取差异,然后查看使用的内存量。快速样本
import java.util.ArrayList;
import java.util.List;
public class MemoryTest {
private static final int KB = 1024;
public static void main(String[] args) {
long initialMemory = getUsedMemory();
List<String> dummy = new ArrayList<String>();
for(int i=0; i<10000; i++){
dummy.add("Dummy " + i);
}
System.out.println("Total used by program = " + (getUsedMemory() - initialMemory) + " KB");
}
private static long getUsedMemory() {
Runtime runtime = Runtime.getRuntime();
return (runtime.totalMemory() - runtime.freeMemory()) / KB;
}
}