JVM将其内存分为两大类:堆内存和非堆内存。堆内存是人们通常最熟悉的部分。它是存储由应用程序创建的对象的位置。它们一直存在,直到它们不再被引用并被垃圾收集。通常,应用程序使用的堆量将根据当前负载而波动。
JVM的非堆内存分为几个不同的区域。我们可以使用HotSpot VM的本机内存跟踪(NMT)来检查这些区域的内存使用情况。请注意,虽然NMT不跟踪所有原生本机Native内存使用情况(例如,它不跟踪第三方本机代码内存分配),但对于大类典型的Spring应用程序来说已经足够了。可以通过启动应用程序-XX:NativeMemoryTracking=summary然后使用jcmd VM.native_memory summary来显示内存使用情况摘要来使用NMT 。
让我们通过查看应用程序来说明NMT的使用,在这种情况下,我们的老朋友Petclinic。下面的饼图显示了当使用48MB最大堆(-Xmx48M)启动Petclinic时由NMT报告的JVM的内存使用量(减去其自身的开销):
正如您所看到的,非堆内存占绝大多数JVM的内存使用量,堆内存仅占总数的六分之一。在这种情况下,大约44MB(垃圾收集后立即使用33MB)。非堆内存使用总量为223MB。
-
压缩类空间:用于存储有关已加载的类的信息。受到约束MaxMetaspaceSize。已加载的类数的函数。
-
线程:JVM中线程使用的内存。正在运行