为什么 class 元空间在 Java 8 中随时间增加?

Why class metaspace increase over time in Java 8?

我是运行 Tomcat 应用程序(由Hibernate + EhCache 组成)。这是典型的 ORM webapp,不应创建大量 classes。但是,Native Memory Tracking 表示 "Nay"。

在过去的 24 小时内,我的网络应用程序在元空间中平均每小时创建 ~1 个新 class,峰值每小时 11 classes,峰值 4 小时不创建 classes .

所以,我从 7449 classes 开始,24 小时后我有 7481 classes。 引入full GC后,classes的数量可以减少0-2,但总体保持不变。

所以

  1. 如果延迟加载 classes,我如何估计要在本机内存中创建的 classes 的总数?

    • 我知道 Hibernate 会创建代理 classes。有没有办法预测这些代理 class 计数?
    • 如何强制 JVM 急切加载所有 classes?
  2. 如何记录哪些新 classes 加载到元空间?

我的配置:

Server version: Apache Tomcat/8.0.28
OS Name:        Linux
OS Version:     3.14.34-27.48.amzn1.x86_64
Architecture:   amd64
JVM Version:    1.8.0_71-b15
JVM Vendor:     Oracle Corporation

JVM flags: -Xms512m -Xmx2G -XX:+UseG1GC -XX:NativeMemoryTracking=summary -XX:+UnlockDiagnosticVMOptions -XX:+PrintNMTStatistics
Hibernate 4.3.1

Is there a way to predict these proxy class count

一般来说,不会。理论上,应用程序可以随时发出 class 文件字节码。

How to force JVM to load all classes eagerly?

你不能。延迟 class 加载是 Java 功能之一。好吧,您可以扫描 class 路径并加载所有 JAR 中的所有 classes,但这不是您想要做的,因为它最终会包含数千个从未使用过的 class es.

How can I log which new classes where loaded into Metaspace?

使用-XX:+TraceClassLoading