Jvm Java8:为什么元空间大小增加,但加载的类数量保持不变?

Jvm Java8:为什么元空间大小增加,但加载的类数量保持不变?,jvm,java-8,metaspace,Jvm,Java 8,Metaspace,在Jdk 8上运行的应用程序中,我们使用VisualVM跟踪加载类的使用情况和元空间的使用情况 在我们的应用程序运行时的某个时间点,我们看到加载的类的数量不再增加,但在我们的程序运行时,元空间的大小仍然增加。所以,除了类之外,还有什么别的东西存储在元空间中呢?我不确定,但是希尔()我资助了这个 一旦类元数据使用达到“MaxMetaspaceSize”,就会触发对死类和类加载器的垃圾收集 这可能是增加元空间大小的原因。当程序运行时,HotSpot的JIT编译器可能会将代码的某些部分确定为“热”。这

在Jdk 8上运行的应用程序中,我们使用VisualVM跟踪加载类的使用情况和元空间的使用情况

在我们的应用程序运行时的某个时间点,我们看到加载的类的数量不再增加,但在我们的程序运行时,元空间的大小仍然增加。所以,除了类之外,还有什么别的东西存储在元空间中呢?我不确定,但是希尔()我资助了这个

一旦类元数据使用达到“MaxMetaspaceSize”,就会触发对死类和类加载器的垃圾收集


这可能是增加元空间大小的原因。

当程序运行时,HotSpot的JIT编译器可能会将代码的某些部分确定为“热”。这将导致这些部分被转换/编译为本机代码,并且一些其他代码可能被内联到其中。这种本机代码表示必须放在某个地方,并且它与其他类元数据放在同一个位置—元空间


它解释了您所看到的持续增长:热门部分是通过使用一个简单的度量值来确定的,该度量值表示代码执行了多少次。随着时间的推移,越来越多的代码片段将被JIT'ed,因为它们将达到

设置的阈值。我想,虽然加载的类的数量停滞不前,但实际使用的代码量仍可能增加……嗯,我不明白你的意思。类的代码已经在那里了,还有什么应该在那里呢?你认为JVM在RAM中存储类的方式与它们在硬盘上的存储方式相同吗?元信息是分析的结果,或者更一般地说,是处理类文件的内容的结果,工作(或部分工作)可能会推迟到真正使用某个方法。啊,你是对的。也许Hotspot编译的本机代码也会出现在那里?对此不确定。但我知道编译后的代码会进入
CodeCache
区域,因此与元空间无关。您是否使用了大量反射(或者像Spring这样的框架)?可能存在关于存储在元空间中的代理(方法句柄等)的元信息,这些代理不算作加载的类。OP特别指出加载的类的数量不再增加。不管死亡与否,总量应该是稳定的。