Java JVM本机内存跟踪如何限制类元数据大小

Java JVM本机内存跟踪如何限制类元数据大小,java,docker,memory-management,jvm,Java,Docker,Memory Management,Jvm,最初的问题是java应用程序is docker由于内存使用而被杀死。 因此,我开始使用NMT来理解为什么消费超过预期。 JVM版本是1.8.0_212,支持容器。 docker推出了下一个java选项 JAVA_OPTS='-XX:+AlwaysPreTouch -Xmx128m -Xms128m -XX:MaxMetaspaceSize=150m -XX:ReservedCodeCacheSize=100m -XX:+UseStringDeduplication -XX:+PrintFlags

最初的问题是java应用程序is docker由于内存使用而被杀死。 因此,我开始使用NMT来理解为什么消费超过预期。 JVM版本是1.8.0_212,支持容器。 docker推出了下一个java选项

JAVA_OPTS='-XX:+AlwaysPreTouch -Xmx128m -Xms128m -XX:MaxMetaspaceSize=150m -XX:ReservedCodeCacheSize=100m -XX:+UseStringDeduplication -XX:+PrintFlagsFinal -XshowSettings:vm -XX:NativeMemoryTracking=detail' ... -m="450m" --cpu-shares="256" docker-image
本机内存跟踪:

Total: reserved=1464054KB +843KB, committed=344578KB +1359KB

...

-                     Class (reserved=1124594KB +19KB, committed=85066KB +275KB)
                            (classes #15631)
                            (malloc=2290KB +19KB #20081 +27)
                            (mmap: reserved=1122304KB, committed=82776KB +256KB)
...
所有数字与预期一致。唯一的问题是类字段,因为它显示了约1GB的保留值,它是否可以以某种方式减少?

这是

默认限制正好是1GB,可以使用
-XX:CompressedClassSpaceSize=N
减小

本机内存跟踪输出中的“类”区域包括元空间和压缩类空间,这就是为什么会看到超过1GB的保留空间。然而,保留的内存只是虚拟地址空间的大小——它不占用物理内存页

更多关于

这是

默认限制正好是1GB,可以使用
-XX:CompressedClassSpaceSize=N
减小

本机内存跟踪输出中的“类”区域包括元空间和压缩类空间,这就是为什么会看到超过1GB的保留空间。然而,保留的内存只是虚拟地址空间的大小——它不占用物理内存页


更多关于

为什么?你的问题是提供足够的内存,而不是减少任何东西。你真的使用了15691个类,它们就在那里。1gd保留,对于我的小微服务来说似乎太多了,它什么也不做:)似乎因为一些逻辑(可能是因为aop spring),它不断生成新的类。因为限制是1gb,所以它将是新的GCG。通过使用-XX:+UseSerialGC参数更改默认GC算法(并行GC),您可以看到最大的更改。为什么?你的问题是提供足够的内存,而不是减少任何东西。你真的使用了15691个类,它们就在那里。1gd保留,对于我的小微服务来说似乎太多了,它什么也不做:)似乎因为一些逻辑(可能是因为aop spring),它不断生成新的类。因为限制是1gb,所以它会更高。通过使用-XX:+UseSerialGC参数更改默认GC算法(并行GC),您可以看到最大的更改。对于我来说CompressedClassSpaceSize:=148897792。这相当于~142MB。它用-XX:+PrintFlagsFinalsWierd打印。当显式设置-XX:CompressedClassSpaceSize=150m时,jvm NMT显示类保留空间=200mb@user2105282142 MB=150-2*4=MaxMetaspaceSize-2*InitialBootClassLoaderMetaspaceSize。在中解释。对于我,压缩ClassSpaceSize:=148897792。这相当于~142MB。它用-XX:+PrintFlagsFinalsWierd打印。当显式设置-XX:CompressedClassSpaceSize=150m时,jvm NMT显示类保留空间=200mb@user2105282142 MB=150-2*4=MaxMetaspaceSize-2*InitialBootClassLoaderMetaspaceSize。在中解释。