Runtime.getRuntime.freeMemory()没有打印正确的值?

时间:2014-01-01 05:45:46

标签: java memory

下面的代码打印内存相同的值?理想情况下,在对象分配之后应该减少空闲内存。我的理解是否正确?

System.out.println(Runtime.getRuntime().freeMemory());
Person p = new Person();
p.setFirstName("bob");
System.out.println(Runtime.getRuntime().freeMemory());

3 个答案:

答案 0 :(得分:3)

正如运行时javadoc所述,freeMemory()将近似值返回到当前可用于未来分配对象的内存总量,这意味着您无法获得精确值。

答案 1 :(得分:2)

这是因为JVM在TLAB(线程局部分配缓冲区)中创建了Person,您可以在Peter Lawrey的评论中找到简短的解释,并从HotSpot开发人员https://blogs.oracle.com/daviddetlefs/entry/tlab_sizing_an_annoying_little中找到更多详细信息。实际发生的事情如下:

在运行第一个Runtime.freeMemory之前,当前线程已在堆中创建了TLAB,Runtime.freeMemory显示了没有TLAB的空闲内存。当你创建一个Person时,它被放置在TLAB中,因为TLAB中有空闲空间,所以从Runtime.freeMemory的角度看,没有任何改变。

尝试在运行测试时关闭此功能

java -XX:-UseTLAB ...

它将显示正确的人物大小

答案 2 :(得分:1)

请查看免费内存和总内存的官方文档

docs

免费记忆:

public long freeMemory():返回Java虚拟机中的可用内存量。调用gc方法可能会导致freeMemory返回的值增加。

返回:     当前可用于未来分配对象的内存总量的近似值,以字节为单位。

总内存:

public long totalMemory()返回Java虚拟机中的内存总量。此方法返回的值可能会随着时间的推移而变化,具体取决于主机环境。

注意保存任何给定类型的对象所需的内存量可能与实现有关。

返回:     当前和未来对象当前可用的内存总量,以字节为单位。

  

如果你想找出你的对象使用的内存,那么你必须这样做   通过减去totalMemory - freeMemory来计算,如下所示。

   System.out.prinltn("Memory Used by the Person Object" +
Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory());