Java JVM元空间在调整大小时是否总是触发GC

Java JVM元空间在调整大小时是否总是触发GC,java,garbage-collection,jvm,metaspace,Java,Garbage Collection,Jvm,Metaspace,Java 8之后的JVM 当metaspace的大小>-XX:metaspaceSize时,它将触发gc。 无论您如何配置-XX:metaspaceSize和-XX:maxMetaspaceSize,在64位服务器上,metaspace的初始大小通常是一个固定值20.8M。 当元空间接近当前容量时,JVM将自动调整其大小。 然后,如果-XX:metaspaceSize是20G,例如,元空间的当前大小是18M,必须分配大量大约100M的新对象,JVM必须为这些新对象调整元空间的大小,JVM会在调整

Java 8之后的JVM

当metaspace的大小>-XX:metaspaceSize时,它将触发gc。 无论您如何配置-XX:metaspaceSize和-XX:maxMetaspaceSize,在64位服务器上,metaspace的初始大小通常是一个固定值20.8M。 当元空间接近当前容量时,JVM将自动调整其大小。 然后,如果-XX:metaspaceSize是20G,例如,元空间的当前大小是18M,必须分配大量大约100M的新对象,JVM必须为这些新对象调整元空间的大小,JVM会在调整大小之前触发完整的GC吗?
您可以配置元空间大小,但JVM可以根据不同的平台增加或减少大小。 看

-XX:MetaspaceSize=size

设置分配的类元数据空间的大小,该空间将在第一次超出时触发垃圾回收。垃圾收集的此阈值根据使用的元数据量而增加或减少。默认大小取决于平台


您可以配置元空间大小,但JVM可以根据不同的平台增加或减少大小。 看

-XX:MetaspaceSize=size

设置分配的类元数据空间的大小,该空间将在第一次超出时触发垃圾回收。垃圾收集的此阈值根据使用的元数据量而增加或减少。默认大小取决于平台

首先,元空间的大小是模糊的,因此没有上下文就没有意义。至少有五个指标:中所述的保留、已提交、容量和已用内存,以及高水位线,也称为容量直到gc

元空间不仅仅是一个连续的内存区域,因此它不会按照常识调整大小。相反,当分配发生时,上述一个或多个指标会发生变化

在最快路径上,从当前块分配元数据块。在这种情况下,已用内存会增加,仅此而已。 如果当前块中没有足够的空间,JVM将搜索可能空闲的现有块。如果它成功地重用了块,那么容量就会增加。在此之前,没有GC发生。 如果没有空闲块,JVM将尝试提交更多内存,除非新提交的大小将超过容量。 如果达到容量\u直到\u gc阈值,JVM将触发gc循环。 如果GC没有释放足够的内存,则会增加高水位线,以便分配另一个虚拟空间。 GC后,根据以下公式调整高水位线值:

-XX:MinMetaspaceFreeRatio用于计算元空间容量中需要多少可用空间,以决定增加HWM的量; -XX:MaxMetaspaceFreeRatio,用于在减少HWM之前,确定metaspace容量中需要多少可用空间; -XX:MinMetaspaceExpansion元空间的最小扩展(以字节为单位); -XX:MaxMetaspaceExpansion在没有完全GC的情况下Metaspace的最大扩展。 TL;博士,事情没那么简单。JVM绝对可以在不触发GC的情况下提交更多的元空间内存。但是,当达到HWM时,会触发GC,并根据人体工程学策略重新计算HWM。

首先,元空间的大小不明确,因此没有上下文就没有意义。至少有五个指标:中所述的保留、已提交、容量和已用内存,以及高水位线,也称为容量直到gc

元空间不仅仅是一个连续的内存区域,因此它不会按照常识调整大小。相反,当分配发生时,上述一个或多个指标会发生变化

在最快路径上,从当前块分配元数据块。在这种情况下,已用内存会增加,仅此而已。 如果当前块中没有足够的空间,JVM将搜索可能空闲的现有块。如果它成功地重用了块,那么容量就会增加。在此之前,没有GC发生。 如果没有空闲块,JVM将尝试提交更多内存,除非新提交的大小将超过容量。 如果达到容量\u直到\u gc阈值,JVM将触发gc循环。 如果GC没有释放足够的内存,则会增加高水位线,以便分配另一个虚拟空间。 GC后,根据以下公式调整高水位线值:

-XX:MinMetaspaceFreeRatio用于计算元空间容量中需要多少可用空间,以决定增加HWM的量; -XX:MaxMetaspaceFreeRatio,用于在减少HWM之前,确定metaspace容量中需要多少可用空间; -XX:MinMetaspaceExpansion元空间的最小扩展(以字节为单位); -XX:MaxMetaspaceExpansion在没有完全GC的情况下Metaspace的最大扩展。 TL;博士,事情没那么简单。JVM绝对可以在不触发GC的情况下提交更多的元空间内存。但是,当达到HWM时,会触发GC,并根据人体工程学政策重新计算HWM


否,元空间大小调整不会触发完全GC。JVM将在触发GC之后调整Meta SpACE。当你认为“增长”和“调整大小”是不同的事情时,似乎有一种奇怪的心态,比如“当Meta是从18M成长到40M……,JVM必须调整Meta SpACE”,因为从18M到40M的增长不是调整大小的原因。“但结果是这样的。”霍尔格很抱歉,我没有说清楚,你把这个背对了。GC在空间不足时运行,因此可能会导致调整大小。不是原因。不,元空间大小调整不会触发完全GC。JVM将在触发GC之后调整Meta SpACE。当你认为“增长”和“调整大小”是不同的事情时,似乎有一种奇怪的心态,比如“当Meta是从18M成长到40M……,JVM必须调整Meta SpACE”,因为从18M到40M的增长不是调整大小的原因。“但结果是这样的。”霍尔格很抱歉,我没有说清楚,你把这个背对了。GC在空间不足时运行,因此可能会导致调整大小。不是原因。