我的程序使用Java有多少内存

时间:2015-08-11 10:12:49

标签: java memory time artificial-intelligence

我制作了一个程序,它使用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

4 个答案:

答案 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;
    }
}