NMT Class 提交与 Jstat 压缩 Class Space
NMT Class committed vs Jstat Compressed Class Space
我正在调查 OutOfMemoryError: Compressed Class Space 问题。我认为,我找到了我的根本原因和解决方案(JAXBContext.newInstance() 由 Hibernate Validator 方法调用:用户提交的每个操作后的 buildValidatorFactory)但是在我的研究过程中我注意到一件令人困惑的事情。
我已经尝试 运行 jcmd VM.native_memory 和 jstat -gc 来跟踪 Class 提交的大小和 CCSU(压缩的 Class Space 用法) :
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 中的 "Class committed" 指标和 jstat 中的 CCSU 指标之间没有重大差异,但 jstat 显示仅使用了 1.72 MB 的内存,而 Class Committed 超过 24 MB。所以我生成了 GC.class_stats 统计数据,它显示 KlassBytes 大约为 1738616 B -> 1,739 MB - 因此它与 CCSU 中显示的 jstat 的值大致相同。我还发现其余的元数据(如方法、常量等)占用了大约 14,44 MB(这与 mmap 中的值大致相同:committed=14720KB - 但我不知道这个数字是多少)。
那么剩下的呢? NMT给出的数字到底是多少?
本机内存跟踪报告中的 Class
部分显示 Metaspace 和 Compressed Class Space 的汇总数字。 元空间和压缩ClassSpace的区别在.
中解释
来自 Memory Footprint of a Java Process 演示文稿的幻灯片
jstat 指标 MC
、MU
、CCSC
和 CCSU
代表
- 元空间容量
- 使用元空间
- 压缩ClassSpace容量
- 压缩ClassSpace使用
Committed、Capacity 和 Used 之间的关系在 .
因此,本机内存跟踪显示的 Class Committed 与具有以下不等式的 jstat 指标相关:
Class Committed >= MC + CCSC >= MU + CCSU
但是,它们之间的差异可以任意大。
自 JDK 10 起,本机内存跟踪报告显示 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%)
我正在调查 OutOfMemoryError: Compressed Class Space 问题。我认为,我找到了我的根本原因和解决方案(JAXBContext.newInstance() 由 Hibernate Validator 方法调用:用户提交的每个操作后的 buildValidatorFactory)但是在我的研究过程中我注意到一件令人困惑的事情。
我已经尝试 运行 jcmd VM.native_memory 和 jstat -gc 来跟踪 Class 提交的大小和 CCSU(压缩的 Class Space 用法) :
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 中的 "Class committed" 指标和 jstat 中的 CCSU 指标之间没有重大差异,但 jstat 显示仅使用了 1.72 MB 的内存,而 Class Committed 超过 24 MB。所以我生成了 GC.class_stats 统计数据,它显示 KlassBytes 大约为 1738616 B -> 1,739 MB - 因此它与 CCSU 中显示的 jstat 的值大致相同。我还发现其余的元数据(如方法、常量等)占用了大约 14,44 MB(这与 mmap 中的值大致相同:committed=14720KB - 但我不知道这个数字是多少)。
那么剩下的呢? NMT给出的数字到底是多少?
Class
部分显示 Metaspace 和 Compressed Class Space 的汇总数字。 元空间和压缩ClassSpace的区别在
来自 Memory Footprint of a Java Process 演示文稿的幻灯片
jstat 指标 MC
、MU
、CCSC
和 CCSU
代表
- 元空间容量
- 使用元空间
- 压缩ClassSpace容量
- 压缩ClassSpace使用
Committed、Capacity 和 Used 之间的关系在
因此,本机内存跟踪显示的 Class Committed 与具有以下不等式的 jstat 指标相关:
Class Committed >= MC + CCSC >= MU + CCSU
但是,它们之间的差异可以任意大。
自 JDK 10 起,本机内存跟踪报告显示 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%)