Java Runtime.getRuntime.freeMemory()打印的值是否正确?

Java Runtime.getRuntime.freeMemory()打印的值是否正确?,java,memory,Java,Memory,下面的代码为内存打印相同的值?理想情况下,在对象分配之后,应该减少可用内存。我的理解正确吗 System.out.println(Runtime.getRuntime().freeMemory()); Person p = new Person(); p.setFirstName("bob"); System.out.println(Runtime.getRuntime().freeMemory()); 正如运行时javadoc所述,freeMemory()返回当前可用于未来分配对象的内存总量

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

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

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

请查阅官方文档了解可用内存和总内存

可用内存:

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

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

总内存:

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

注意保存任何给定类型的对象所需的内存量可能取决于实现

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

如果您想找出对象使用的内存,那么您必须 通过减去totalMemory-freeMemory进行计算,如下所示


这是因为JVM在TLAB(线程本地分配缓冲区)中创建了Person,您可以在Peter Lawrey的评论中找到简短的解释,并从这里的一位热点开发人员那里找到更多细节。实际发生的情况如下:

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

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

java -XX:-UseTLAB ...

它将显示正确的人的大小

可能会有所帮助。+1 TLAB将内存分块分配,这样每个线程都可以同时(从自己的块)创建对象。对于多线程应用程序,关闭TLAB的速度较慢,但可以准确计算。因此,当我们运行第一个运行时。freeMemory()已经为我们的线程分配了一个块,对吗?
java -XX:-UseTLAB ...