Java 获取内存使用情况

公司要求将各个设备上传的数据分析并且导出到统一的一个表中,目前在准备,数据比较多,所以需要考虑到内存的使用情况,经网上查询使用,出现了以下问题。

第一种方法Runtime

    LogUtils.debug("TotalMemory", Runtime.getRuntime().totalMemory()/(1024*1024)+"M");
    LogUtils.debug("FreeMemory", Runtime.getRuntime().freeMemory()/(1024*1024)+"M");
    LogUtils.debug("MaxMemory", Runtime.getRuntime().maxMemory()/(1024*1024)+"M");
    LogUtils.debug("UsedMemory", (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory())/(1024*1024)+"M");

当然,获取数据是获取到了,但是发现TotalMemory与FreeMemory会变化,感觉这个有问题,所以继续查询,搜到了以下一种方式。

第二种方式

    MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();

    MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage(); //椎内存使用情况

    long totalMemorySize = memoryUsage.getInit(); //初始的总内存

    long maxMemorySize = memoryUsage.getMax(); //最大可用内存

    long usedMemorySize = memoryUsage.getUsed(); //已使用的内存

    LogUtils.debug("TotalMemory", totalMemorySize/(1024*1024)+"M");
    LogUtils.debug("FreeMemory", (totalMemorySize-usedMemorySize)/(1024*1024)+"M");
    LogUtils.debug("MaxMemory", maxMemorySize/(1024*1024)+"M");
    LogUtils.debug("UsedMemory", usedMemorySize/(1024*1024)+"M");

第二种方法获取到的总内存不会变化,是我想要的。
那么,问题来了,为什么第一中获取总内存会变化呢?我猜可能与运行时情况有关,但被什么用了,就不清楚了,希望得到大神的解答

你可能感兴趣的:(java基础学习)