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

时间:2019-06-18 09:21:45

标签: java docker memory-management jvm

最初的问题是,由于内存使用情况,Java应用程序被docker杀死了OOM。 因此,我开始使用NMT来了解为什么消费量超出预期。 JVM版本是1.8.0_212,具有容器支持。 使用下一个Java选项启动Docker

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的保留值,因此可以以某种方式降低吗?

1 个答案:

答案 0 :(得分:1)

这是Compressed Class Space

默认限制为1GB,可以通过-XX:CompressedClassSpaceSize=N降低。

本机内存跟踪输出中的“类”区域包括元空间和压缩的类空间,这就是为什么您看到保留了1GB以上的原因。但是,保留的内存仅是虚拟地址空间的数量-它不占用物理内存页。

有关JVM virtual memory

的更多信息