【问题标题】:NMT Class committed vs Jstat Compressed Class SpaceNMT 类已提交与 Jstat 压缩类空间
【发布时间】:2019-10-18 19:35:54
【问题描述】:

我正在调查 OutOfMemoryError: Compressed Class Space 问题。我认为,我找到了我的根本原因和解决方案(由 Hibernate Validator 方法调用的 JAXBContext.newInstance():在用户提交的每个操作之后 buildValidatorFactory),但在我的研究过程中,我注意到了一件令人困惑的事情。

我尝试运行 jcmd VM.native_memory 和 jstat -gc 来跟踪类提交大小和 CCSU(压缩类空间使用):

d:\experiments>jcmd 59692 VM.native_memory summary
Native Memory Tracking:

Total: reserved=10039335KB, committed=889895KB
-                 Java Heap (reserved=8353792KB, committed=522240KB)
                            (mmap: reserved=8353792KB, committed=522240KB)

-                     Class (reserved=1072460KB, **committed=24268KB**)
                            (classes #2518)
                            (malloc=9548KB #2393)
                            (mmap: reserved=1062912KB, committed=14720KB)

d:\experiments>jstat -gc 59692 2s
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
21504,0 21504,0  0,0    0,0   131072,0 56218,7   139264,0    7755,5   14976,0 14318,5 1920,0 1721,7      2    0,012   1      0,036   -          -    0,048

我预计 NMT 中的“已提交类”指标和 jstat 中的 CCSU 指标之间没有重大区别,但 jstat 显示的已用内存大约只有 1.72 MB,而已提交的类已超过 24 MB。所以我生成了 GC.class_stats 统计数据,它显示 KlassBytes 大约为 1738616 B -> 1,739 MB - 所以它与 CCSU 中的 jstat 显示的值大致相同。我还发现其他元数据(如方法、常​​量等)占用了大约 14,44 MB(这与 mmap 中的值大致相同:committed=14720KB - 但我不知道这个数字是多少)。

那么剩下的部分在哪里呢? NMT 给出的数字到底是多少?

【问题讨论】:

    标签: java memory-management jvm jstat jcmd


    【解决方案1】:
    本机内存跟踪报告中的

    Class 部分显示了 MetaspaceCompressed Class Space 的汇总数字。 元空间压缩类空间的区别在here解释。

    Memory Footprint of a Java Process 演示文稿中的幻灯片


    jstat 指标 MCMUCCSCCCSU 代表

    • 元空间容量
    • 使用的元空间
    • 压缩类空间容量
    • 使用的压缩类空间

    CommittedCapacityUsed之间的关系在this answer中解释。

    因此,Native Memory Tracking 显示的 Class Committed 与 jstat 指标相关,具有以下不等式:

    Class Committed >= MC + CCSC >= MU + CCSU
    

    但是,它们之间的差异可以任意大。


    自 JDK 10 起,Native Memory Tracking 报告显示了Class 部分的详细细分:

    -     Class (reserved=1073841KB, committed=28593KB)
                (classes #3967)
                (  instance classes #3694, array classes #273)
                (malloc=689KB #9228) 
                (mmap: reserved=1073152KB, committed=27904KB) 
                (  Metadata:   )
                (    reserved=24576KB, committed=24576KB)
                (    used=24131KB)
                (    free=445KB)
                (    waste=0KB =0.00%)
                (  Class space:)
                (    reserved=1048576KB, committed=3328KB)
                (    used=3003KB)
                (    free=325KB)
                (    waste=0KB =0.00%)
    

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 1970-01-01
      • 2022-07-21
      • 1970-01-01
      • 2015-07-20
      • 2023-02-23
      • 2017-02-16
      • 1970-01-01
      • 2014-05-21
      相关资源
      最近更新 更多