Java 基于运行时内存方法获取freeMemory的行为非常古怪
我正在使用运行时的内存近似方法来进行一些内存使用分析。我创建了以下方法,用于在给定时间近似计算JVM中的空闲内存量:Java 基于运行时内存方法获取freeMemory的行为非常古怪,java,hibernate,memory-management,jvm,runtime,Java,Hibernate,Memory Management,Jvm,Runtime,我正在使用运行时的内存近似方法来进行一些内存使用分析。我创建了以下方法,用于在给定时间近似计算JVM中的空闲内存量: private static long getFreeRuntimeMemory(){ long usedMem, freeMem; usedMem = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); freeMem = Runtime.getRuntime(
private static long getFreeRuntimeMemory(){
long usedMem, freeMem;
usedMem = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
freeMem = Runtime.getRuntime().maxMemory() - usedMem;
//System.out.println("used "+ usedMem+ " free "+ freeMem);
return freeMem;
}
我调用这个方法两次——在主方法的第一行,在主方法的最后一行。在这两个调用中,我执行了一些基于hibernate的数据库检索
奇怪的是,这个方法的返回值在第一次调用时更小。这怎么可能?我确实创建了一些对象,它们不应该在主要结束之前解除分配。1,)最大内存不一定是常数2。)值可能会在三个方法调用之间发生变化,因此不能保证一致3。)在第一次调用之前堆上可能有未使用的对象,这些对象在第二次调用之前已被释放。#1)在我的情况下似乎是常数,在JVM启动之前,最大内存不是固定的吗#2,3)-经过我自己的一些研究,这是有意义的。最大内存是否固定取决于实现。