下面的代码打印内存相同的值?理想情况下,在对象分配之后应该减少空闲内存。我的理解是否正确?
System.out.println(Runtime.getRuntime().freeMemory());
Person p = new Person();
p.setFirstName("bob");
System.out.println(Runtime.getRuntime().freeMemory());
答案 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)
请查看免费内存和总内存的官方文档
免费记忆:
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());